索引失效问题排查
通过SQL执行计划explain排查
重点关注type
、key
、extra
这三个字段。
命令格式:explain SQL语句
例如:
explain select * from `mytable` where name like 'leaso%n';
如果有用到索引,那么是走了覆盖索引
?还是索引下推
?还是扫描了整颗索引树
?或是用到了索引跳跃扫描
呢?
一般来说,比较理想的走索引的话,应该是一下几种情况:
首先:key
一定是要有值的,不能是NULL
其次:type
应该是ref
、eq_ref
、range
、const
等这几中类型。
最后:查看extra
,如果是NULL
、Using index
、Using index condition
都是可以的。
如果通过执行计划查看发现一条SQL
没有走索引,比如:type = ALL
,key = NULL
,extra = Using where
可能有以下几种可能导致没走索引:
1.没有正确创建索引:查询语句where条件中的字段,没创建索引,或不符合最左前缀匹配。
2.索引区分度不高:索引区分度不够高那么也不会走索引。
3.表太小:表数据库量小,优化器认为扫描全表的成本也不高的时候,也可能不会走索引。
4.查询语句中,索引字段因为用到了函数、类型不一致导致的索引失效。
可能导致索引失效的情况
索引列参与计算
-- 使用索引
explain select * from `mytable` where age = 12 ;
-- 使用索引
explain select * from `mytable` where age = 12 +1 ;
-- 不能使用索引 字段中增加了函数操作
explain select * from `mytable` where age + 1 = 12;
对索引列进行函数操作
-- 使用索引
explain select * from `mytable