Mysql索引失效情况
mysql索引失效有以下几种情况:
1、查询条件中有or (普通索引)
2、like查询是以'%'开头
但是如果想让以‘%’开头仍然使用索引,则需要使用覆盖索引,即只查询带索引字段的列:
EXPLAIN SELECT name FROM `user` WHERE name like '%张三'
3.对查询的列上有运算或者函数的
explain SELECT name,age,address FROM user where substr(name,-2)='头强'
EXPLAIN SELECT * FROM `user` where age+1
4、如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
explain SELECT name,age,address FROM user where name = 10
这里面的原因其实跟例3是一样的,首先mysql有个类型转换规则就是将“字符转成数字”,所以以上sql就等价于这样:
explain SELECT name,age,address FROM user where cast(name as signed)= 10
5、左连接查询或者右连接查询查询关联的字段编码格式不一样
注意user 表的name字段编码是utf8mb4,而school表的name字段编码为gbk。执行左外连接查询:
explain SELECT a.*,b.* FROM user as a LEFT JOIN school as b on a.name = b.name;
6、如果mysql估计使用全表扫描要比使用索引快,则不使用索引
7、连接查询中,按照优化器顺序的第一张表不会走索引
8、如果查询中没有用到联合索引的第一个字段,则不会走索引