在MySQL的查询优化中,索引是一项至关重要的技术,它能够大大提升数据检索的效率。本文将讨论这11种常见情况,帮助开发者更好地理解索引的使用及优化。
1 |
SELECT * FROM users WHERE age != 30; |
1 2 |
SELECT * FROM users WHERE age NOT BETWEEN 30 AND 30; SELECT * FROM users WHERE`age > 30`AND`age < 30; |
1 |
SELECT * FROM users WHERE age = 30 OR gender = 'male'; |
1 2 3 4 5 6 7 |
--创建联合索引 create index idx_users_age_gender on users(age,gender); SELECT * FROM users WHERE age = 30 OR gender = 'male'; --使用UNION合并子查询 SELECT * FROM users WHERE age = 30 UNION SELECT * FROM users WHERE gender = 'male'; |
1 |
SELECT * FROM orders WHERE YEAR(order_date) = 2024; |
1 2 3 4 5 6 |
--范围查询 SELECT * FROM orders WHERE order_date >= '2024-01-01' AND order_date < '2025-01-01'; --直接存储处理后的数据 ALTER TABLE orders add column order_year INT; -- 新增字段 order_year UPDATE orders SET order_year = YEAR(order_date); SELECT * FROM orders WHERE order_year = 2024; |
1 |
SELECT * FROM users WHERE CAST(age AS CHAR) = '30'; |
1 |
SELECT * FROM users WHERE name LIKE '%john'; |
1 |
SELECT * FROM users WHERE name LIKE 'john%'; |
1 |
SELECT * FROM users WHERE age IS NULL; |
1 2 3 4 5 6 |
-- 使用IFNULL() 函数 SELECT * FROM users WHERE IFNULL(age, -1) = -1; -- 使用COALESCE() 函数 SELECT * FROM users WHERE COALESCE(age, -1) = -1; --使用 NOT NULL 约束,修改字段默认值为 0 ALTER TABLE users MODIFY age NOT NULL DEFAULT 0; |
1 2 |
SELECT DISTINCT age FROM users; SELECT age, COUNT(*) FROM users GROUP BY age; |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
--创建索引 CREATE INDEX idx_users_age ON users(age); SELECT age, COUNT(*) FROM users GROUP BY age;
--子查询获取去重结果集再查询 SELECT age, COUNT(*) FROM users WHERE age IN ( SELECT DISTINCT age FROM users WHERE age IS NOT NULL ) GROUP BY age; |
1 |
SELECT * FROM users u JOIN orders o ON u.id = o.user_id; |
1 2 |
CREATE INDEX idx_user_id ON orders(user_id); CREATE INDEX idx_user_id_users ON users(id); |
1 |
SELECT * FROM users ORDER BY name DESC,age ASC; |
1 2 3 |
-- 创建复合索引 CREATE INDEX idx_name_age ON users(name DESC, age ASC); SELECT * FROM users ORDER BY name DESC, age ASC; |
1 |
SELECT * FROM users u JOIN orders o ON u.id = o.user_id WHERE o.order_date > '2024-01-01'; |
1 2 3 4 5 6 7 8 9 10 |
-- 使用子查询(筛选大表后再去连接) SELECT * FROM (SELECT * FROM orders WHERE order_date > '2024-01-01') o JOIN users u ON u.id = o.user_id; -- 小表驱动大表(如果users表有100条,orders有20万数据) -- 使用 STRAIGHT_JOIN 强制左表为驱动表 SELECT * FROM users u STRAIGHT_JOIN orders o ON u.id = o.user_id WHERE o.order_date > '2024-01-01'; |
1 |
SELECT * FROM users FORCE INDEX (idx_name) WHERE age = 30; |
在 SQL 查询优化中,合适的索引设计和查询结构调整是提高性能的关键。通过以下措施可以避免常见的性能瓶颈: