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、如果查询中没有用到联合索引的第一个字段,则不会走索引

 

posted @ 2020-12-01 22:30  行驶中大神  阅读(611)  评论(0编辑  收藏  举报