目录
一、索引优化
1. 全值匹配
例子:假设有复合索引 idx_name_age_gender (name, age, gender),查询:
SELECT * FROM users WHERE name = '张三' AND age = 25 AND gender = '男';
说明:查询条件完整匹配了索引的所有列(name→age→gender),索引会被完全利用,查询效率最高。
2. 遵循最左前缀法则
例子:同上述索引 idx_name_age_gender,以下两种情况:
- 有效:
WHERE name = '张三' AND age = 25(从最左列 name 开始,使用索引前两列) - 失效:
WHERE age = 25 AND gender = '男'(跳过最左列 name,索引完全失效)
说明:复合索引需从最左列开始使用,跳过左侧列会导致索引无法生效。即使不使用所有列,只要从左侧开始连续使用,部分索引仍能生效。
3. 避免在索引列上做操作
例子:假设有索引 idx_birthday (birthday),以下两种情况:
- 失效:
WHERE YEAR(birthday) = 1990(对索引列使用 YEAR 函数,破坏索引有序性) - 有效:
WHERE birthday BETWEEN '1990-01-01' AND '1990-12-31'(索引列直接参与比较)
说明:对索引列做计算、函数调用或类型转换,会导致数据库无法利用索引的有序性,只能全表扫描。
4. 范围查询对后续索引列的影响
例子:同索引 idx_name_age_gender,查询:
sql
SELECT * FROM users WHERE name = '张三' AND age > 25 AND gender = '男';
说明:age > 25 是范围查询,会导致其右侧的 gender 列索引失效(数据库无法确定范围后的列顺序)。此时索引仅能用到 name 和 age 部分。
5. 尽量使用覆盖索引
例子:索引 idx_name_age (name, age),查询:
SELECT name, age FROM users WHERE name = '张三';
说明:查询的列(name、age)均包含在索引中,无需回表查询主键对应的完整行数据,减少 IO 操作,效率更高。

最低0.47元/天 解锁文章
4581

被折叠的 条评论
为什么被折叠?



