索引失效的情况这么多根本背不完怎么办?尝试从底层原理上理解,以不变应万变,无论你背的索引失效情况有多少种,都在这两种范围内
第一,查询从数据结构上根本走不了索引
第二,mysql优化器根据自己的推断走索引性能一般还不如直接走全表扫描,就不走索引了,这样对外的表现形式就是看起来索引失效了。。注意,优化器也只是推断,到底哪种方式性能高,不一定,所以有时候也会需要人工explain分析看到底哪种方式效率高
索引失效有很多场景,像什么like字段、范围查询、select *。。。。其实还是要理解索引的底层数据结构长什么样子,如何根据主键索引查询到数据,如何根据普通索引查询到数据,每建立一个索引,它都会生成一颗B+树,会不会有覆盖索引,会不会回表,知道索引底层的数据结构,它是如何存储的,根据一条sql语句自然就能判断出来。像网上说的八股文说什么like、between会索引失效,但我不这样看,他也有可能索引下推了,其实数据量也是一个影响因素,如果走索引之后,没有覆盖,还要回表的话,在数据量少的场景下,它可能会直接走全表扫描,因为他走索引还要遍历2棵B+树,其实mysql优化器会进行推断的,如果它发现走索引还不如直接走全表,那他为什么不直接走全表呢。
关键是你对索引失效的定义是什么,如果只是不满足最左前缀原则了,那他确实索引失效,但他也可能存在索引下推的情况。最终还是得看explain关键字的type字段是怎么样的。
个人认为有很多因素都会影响sql语句是否走索引,不能太过武断得进行判断。