其实 一直没有总结什么情况下索引失效,写代码时候,也是看看 那种方式快就使用 那种方式,在加索引的时候,也是 随便 加上去 ,以为就可以了。。。这样不对的。
-
where 条件的 xxx != xx 这种情况 ,索引是无效的, 和 = 不一样的
-
where 条件的 in / or 查询, 也是 索引 无效的, 特别是 or ,能不用就不用, 可以使用 union 联合查询来替代,, union 下面 索引是有效的。
-
where 里面 使用 函数,,也是 索引无效的。 或者对索引列进行运算,运算包括(+,-,*,/,! 等)
-
如果WHERE子句的查询条件里使用了比较操作符LIKE和REGEXP,MYSQL只有在搜索模板的第一个字符不是通配符的情况下才能使用索引。比如说,如果查询条件是LIKE 'abc%',MYSQL将使用索引;如果条件是LIKE '%abc',MYSQL将不使用索引。比如: 前导模糊查询不能利用索引(like '%XX'或者like '%XX%')
-
如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
-
null 查询 索引无效; 更准确的说,单列索引不存储null值,复合索引不存储全为null的值。索引不能存储Null,所以对这列采用is null条件时,因为索引上根本
没Null值,不能利用到索引,只能全表扫描。
-
在JOIN操作中(需要从多个数据表提取数据时),MYSQL只有在主键和外键的数据类型相同时才能使用索引,否则即使建立了 索引也不会使用
-
在ORDER BY操作中,MYSQL只有在排序条件不是一个查询条件表达式的情况下才使用索引。尽管如此,在涉及多个数据表的查
-
不使用NOT IN和<>操作 NOT IN和<>操作都不会使用索引将进行全表扫描。NOT IN可以NOT EXISTS代替,id<>3则可使用id>3 or id<3来代替。