MySQL学习笔记:索引失效
Contents
EXPLAIN中的type为range,而且rows过大时:
- rows的意义和type的枚举值,可参见:EXPLAIN Output Format
- 查询临界值示例:
一般情况:
以下参考:索引失效的情况(很棒的一篇文章,不过有些不准确,比如:使用 >= 不会失效,此处做个总结记录)
WHERE子句中
- 未遵循最左原则
- 在索引列上计算,使用函数
- 在索引列上自动(如:`phone`=18172874277,`phone`是字符串型,所以等号后面的值应加引号),手动转换类型
- 某列使用'>','<',右侧的索引列(按照组合索引字段顺序)
- LIKE以通配符开头
- 组合索引列之间使用OR
GROUP BY子句中(WHERE条件的索引是走的,之后的GROUP BY或者ORDER BY的索引是不走的)
不走索引的标准可以观察执行计划中的Extra: GROUP BY将使用额外的文件排序,以及产生临时表
- 使用组合索引,须遵守最左原则(须按照索引顺序),WHERE子句中的索引字段是等值查询时,可以在GROUP BY子句中省略;
- 存在一个组合索引和一个单索引时,GROUP BY的索引字段在WHERE子句中都有,且WHERE子句中的组合索引是等值查询,且WHERE子句中的单索引是等值查询或者执行计划中的key是单索引时,是会用到索引的
ORDER BY子句中,
不走索引的标准可以观察执行计划中的Extra: ORDER BY将使用额外的文件排序
- 不使用WHERE子句时
- 使用组合索引,须遵守最左原则(须按照索引顺序),且WHERE子句中有效的组合索引;WHERE子句中的有效索引字段是等值查询时,可以在ORDER BY子句中省略;
- 存在多个单索引,或存在非索引字段时
- 存在一个组合索引和一个单索引时,当表中只有一个组合索引,ORDER BY的索引字段在WHERE子句中都有,且WHERE子句中的组合索引是等值查询,且WHERE子句中的单索引是等值查询或者执行计划中的key是单索引时,是会用到索引的
注意:
- 使用IN时,只有一个值时,相当于'=',有多个值时,索引也是有效的
- 索引列各自使用OR时,相当于IN
- LIKE以通配符结尾时,索引有效
- 使用'<=',索引有效
- 上述情况,EXPLAIN中的type为range,在rows过大时,索引均会失效。