索引失效的场景

  1. 联合索引不满足最左匹配原则
  2. 没走覆盖索引,select * 了,如果走强制索引可以看到,时间比不走索引还要长,因为要查索引以外的字段,回表的开销比不走索引还大
  3. Order by 导致索引失效,查询的字段多于 order by 的索引字段,回表开销
  4. 索引列使用了函数
  5. 字段类型不同,如果索引列是个字符串类型,如果查询给的是数字类型,那么就不走索引,但是如果int 类型的字段作为查询条件,查询给的是字符串类型,mysql会将字符串隐式转换为int 类型,这种特殊情况,也会走索引
  6. like 字段左边包含了%不走索引,但是 like 的字段左右都有%,并且查询的所有字段都是索引列,那么会走覆盖索引的
  7. 列对比,如果对两个单独的索引字段进行比对,那么不走索引。只查询索引字段是可以的,走的覆盖索引
  8. Or 关键字不走索引。Mysql 5.7中or 左右两边的列都有索引也不走,但是mysql 8.0中是会走索引的
  9. 不等号导致所以失效。Mysql 5.7中不走,不走是有条件的,查询的返回结果集大于20%,因为回表开销大,就不走,小于20%就会走索引的。但是mysql 8.0走
  10. 范围查找返回数据量多的时候不走索引,回表开销大,返回的数据少的时候走索引

小结:

  • 避免select * ,回表会导致索引失效
  • 尽量走覆盖索引
  • 注意查询条件返回的数据量,数据量多,可能会让索引失效

你可能感兴趣的:(mysql,数据库,sql)