表数据:
索引情况:
其中a是主键,对应主键索引,bcd三个字段组成联合索引,e字段为一个索引
情况一:不符合最左匹配原则
去掉b=1的条件后就不符合最左匹配原则了,导致索引失效
情况二:不正确的like查询
正常使用like:
不正确使用like:
当使用like模糊查询时,如果不以%或者_开头进行查询的话,索引还是有效的。
对索引进行了计算或者使用了函数
对索引进行了类型转换
e字段的类型是varchar类型,下面这个sql需要把e字段中的字符转换为数字,会导致索引失效
使用<>不等于导致索引失效
使用b=1时,索引有效,使用b<>1时索引失效
order by导致索引失效
就算利用索引,但是由于select * 所以需要回表查询(MySQL回表是一个数据库查询优化的概念,主要是针对数据表中所使用的索引并不能覆盖查询语句中所需要的所有字段而引发的问题。这时,MySQL就需要回到数据表中重新查找需要的数据,这也就是回表的含义。),而且回表成本比较高,所以不会走索引。
如果是select b就不需要回表了,此时就会选择走索引
使用or会导致索引失效
select * 导致查询失效
范围查询数据量过多导致索引失效
新增一些数据: