Contents

MySQL学习笔记:索引失效

EXPLAIN中的type为range,而且rows过大时:

https://static.duan1v.top/images/fnPZRGhOQXNVeCx.png
MySQL学习笔记:索引失效
  • 查询临界值示例:
https://static.duan1v.top/images/gA9Bo4uTJKWNHVR.png
MySQL学习笔记:索引失效

一般情况:

以下参考:索引失效的情况(很棒的一篇文章,不过有些不准确,比如:使用 >= 不会失效,此处做个总结记录)

WHERE子句中

  • 未遵循最左原则
  • 在索引列上计算,使用函数
  • 在索引列上自动(如:`phone`=18172874277,`phone`是字符串型,所以等号后面的值应加引号),手动转换类型
  • 某列使用'>','<',右侧的索引列(按照组合索引字段顺序)
  • LIKE以通配符开头
  • 组合索引列之间使用OR

GROUP BY子句中(WHERE条件的索引是走的,之后的GROUP BY或者ORDER BY的索引是不走的)

不走索引的标准可以观察执行计划中的Extra: GROUP BY将使用额外的文件排序,以及产生临时表

  • 使用组合索引,须遵守最左原则(须按照索引顺序),WHERE子句中的索引字段是等值查询时,可以在GROUP BY子句中省略;
https://static.duan1v.top/images/LwYiUt9D7CJfanO.png
MySQL学习笔记:索引失效
https://static.duan1v.top/images/Rnzih58LpGmEbeS.png
MySQL学习笔记:索引失效
  • 存在一个组合索引和一个单索引时,GROUP BY的索引字段在WHERE子句中都有,且WHERE子句中的组合索引是等值查询,且WHERE子句中的单索引是等值查询或者执行计划中的key是单索引时,是用到索引的
https://static.duan1v.top/images/z4nIEPBYRivt9ks.png
MySQL学习笔记:索引失效
https://static.duan1v.top/images/gmuWPfkLtFHwDKb.png
MySQL学习笔记:索引失效

ORDER BY子句中,

不走索引的标准可以观察执行计划中的Extra: ORDER BY将使用额外的文件排序

  • 不使用WHERE子句时
https://static.duan1v.top/images/CXgj8Hv4cJoeySz.png
MySQL学习笔记:索引失效
  • 使用组合索引,须遵守最左原则(须按照索引顺序),且WHERE子句中有效的组合索引;WHERE子句中的有效索引字段是等值查询时,可以在ORDER BY子句中省略;
https://static.duan1v.top/images/VNpLDdQxzmtw2UW.png
MySQL学习笔记:索引失效
  • 存在多个单索引,或存在非索引字段时
https://static.duan1v.top/images/g4ZtmLA56KxSRCb.png
MySQL学习笔记:索引失效
  • 存在一个组合索引和一个单索引时,当表中只有一个组合索引,ORDER BY的索引字段在WHERE子句中都有,且WHERE子句中的组合索引是等值查询,且WHERE子句中的单索引是等值查询或者执行计划中的key是单索引时,是用到索引的
https://static.duan1v.top/images/sJZhQfiam5uDtFc.png
MySQL学习笔记:索引失效

注意:

  • 使用IN时,只有一个值时,相当于'=',有多个值时,索引也是有效的
https://static.duan1v.top/images/U9ouwYeEWIMHstP.png
MySQL学习笔记:索引失效
  • 索引列各自使用OR时,相当于IN
https://static.duan1v.top/images/N94UEZYsecyd25n.png
MySQL学习笔记:索引失效
  • LIKE以通配符结尾时,索引有效
https://static.duan1v.top/images/1lqGQ6FUvaNtIeW.png
MySQL学习笔记:索引失效
  • 使用'<=',索引有效
https://static.duan1v.top/images/uoQsRE8d3Sft1Kk.png
MySQL学习笔记:索引失效
  • 上述情况,EXPLAIN中的type为range,在rows过大时,索引均会失效。
coffee