执行语句select * from user where name = ‘kaka’ and age > 11 and sex = 1;
上面这条sql语句只会命中name和age索引,sex索引会失效。
复合索引失效需要查看key_len的长度即可。
总结:%在后边会命令索引,当使用了覆盖索引时任何查询方式都可命中索引。
以上就是咔咔关于索引失效会出现的原因总结,在很多文章中没有标注MySQL版本,所以你有可能会看到is null 、or索引会失效的结论。
二、从规则方面说明索引失效的原因
================
问题的答案就是第3点,两边类型不一致导致索引失效。
下图是表结构,目前这个表存在两个索引,一个主键索引,一个普通索引phone。
分别执行以下两条SQL语句
explain select * from evt_sms where phone = 13020733815;
explain select * from evt_sms where phone = ‘13020733815’;
从上图可看出,执行第一条SQL没有使用到索引,第二条SQL却使用到了索引。
不错,你也发现了两条SQL的不同,第二条SQL跟第一条SQL逻辑一致,不同的是一个查询条件有引号,一个没有。
问题:为什么逻辑相同的SQL却是用不了索引