总的来说:not in 、!=、< 或 > 、在索引列做聚合函数都会使索引失效,注意:in 不会使索引失效。
1、存在NULL值的情况,索引值是少于表的count(*)值,这种情况下,执行计划自然就去扫描全表了。
2、尽量少用like语句,如果必须用推荐使用like '...%'这样的形式,因为mysql支持的是最左前缀原则,如:
explain select * from course where course_name ='english%'。
3、not in、!= 、<>都会使索引失效,如:
explain select * from course where course_name !='english'。
4、在索引列进行函数运算会使索引失效,如:
explain select * from course where LOWER(course_name) ='english',
explain select * from course where course_name = LOWER('english')-索引生效。
5、如果mysql使用全表扫描要比使用索引快,则不会使用到索引。
6、使用or可能会使索引失效,如:
explain select * from course where course_name ='english' or teacher_id='6' 。