索引失效情况(与MySQL8对比)
索引类型级别
all,index,range,ref,eq_ref,const。从左到右,它们的效率依次是增强的
MySql
原文连接:索引失效
1、like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效。
2、or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效
3、组合索引,不是使用第一列索引,索引失效。(最左匹配原则)4、数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描。
5、在索引列上使用 IS NULL 或 IS NOT NULL操作。
6、在索引字段上使用not,<>,!=。操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。优化方法:key<>0 改为 key>0 or key<0。
7、对索引字段进行计算操作、字段上使用函数。
Mysql 8
注:红色字体为新版本改动
1.like 以%开头或者是%结尾时,索引都有效。
例如:
EXPLAIN SELECT * FROM `user` WHERE userName like "%用户名"
EXPLAIN SELECT * FROM `user` WHERE userName like "用户名%"
EXPLAIN SELECT * FROM `user` WHERE userName like "%用户名%"
以上三种情况索引都有效
2.or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效
3、组合索引,不是使用第一列索引,索引失效。(最左匹配原则)
4、数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,索引有效。
5、在索引列上使用 IS NULL 或 IS NOT NULL操作。是会使用索引的
6、在索引字段上使用not,<>,!=。操作符会使用索引
7、对索引字段进行计算操作、字段上使用函数。会使用索引