MySQL的索引失效是一个比较常见的问题,这种情况一般会在慢SQL发生时需要考虑索引失效的几种情况,考虑是否存在索引失效的问题。
在排查索引失效的时候,第一步一定是找到要分析的SQL语句,然后通过查看他的执行计划。主要关注type、key和extra这几个字段。
我们需要通过key+type+extra来判断一条SQL语句是否用到了索引。如果有用到索引,那么是走 了覆盖索引呢?还是索引下推呢?还是扫描了整棵索引树呢?或者是用到了索引跳跃扫描等等。
一般来说,比较理想的走索引的话,应该是以下几种情况:
如果通过执行计划之后,发现一条SQL没有走索引,比如 type = ALL, key = NULL , extra = Using where 那么就要进一步分析没有走索引的原因了。
那么,有以下这么几种情况可能会导致没走索引:
没有正确创建索引:当查询语句中的where条件中的字段,没有创建索引索引失效的几种情况,或者不符合最左前缀 匹配的话,就是没有正确的创建索引。索引区分度不高:如果索引的区分度不够高,那么可能会不走索引,因为这种情况下走索引的 效率并不高。表太小:当表中的数据很小,优化器认为扫全表的成本也不高的时候,也可能不走索引查询语句中,索引字段因为用到了函数、类型不一致等导致了索引失效。
这时候我们就需要从头开始逐一分析:
如果没有正确创建索引,那么就根据SQL语句,创建合适的索引。如果没有遵守最左前缀那么就 调整一下索引或者修改SQL语句索引区分度不高的话,那么就考虑换一个索引字段。表太小这种情况确实也没啥优化的必要了,用不用索引可能影响不大的排查具体的失效原因,然后针对性的调整SQL语句就行了。
可能导致索引失效的情况:
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。