
上图是employees表的索引
索引失效的场景很多,建议写SQL的时候都使用expalin查看一下执行计划,这样才能准确判断是否使用了索引
一、使用了or的情况
explain select * from employees where first_name='Tzvetan' or gender='F' limit 10;
我们来看这个SQL,or的左右两边的字段只有first_name是有索引的,gender没有索引,这个时候查看执行计划。

我们发现使用的是全表扫描。
然后我们再换一下SQL,or的左右两边的字段都使用索引字段。
explain select * from employees where first_name='Tzvetan' or emp_no=10000 limit 10;
这个时候我们看到使用了索引
结论:使用or连接的两个字段,如果两个字段都是索引字段索引才会生效,否则索引无效。
二、组合索引失效
我们看这一条SQL的执行计划
explain select * from employees where last_name='Tzvetan' limit 10; 
没有使用索引,last_name是组合索引,但是我们单独使用了last_name,不满足最左前缀原则
三、使用like %XXXX
做模糊匹配的时候把%加在最前边的时候,索引无效,加在后面可以

四、类型转换的时候失效
如果不用引号引起来可能类型转换为整形,如果是一个可以转换的字符串,这种时候索引也会无效
五、使用NOT IN
使用NOT IN的时候索引可能会失效,进而使用全表查询

六、查询条件使用函数计算的时候
explain select * from employees where char_length(first_name)=5 limit 10; 