联合索引进行的范围查询为什么会导致索引失效


也是面试问的,由于不够深入底层存储结构,导致对索引的理解不够深刻。加入了 TODO,准备好好的解析底层结构。

自己想的范围查询过程貌似差不多对了。但是没说清楚索引失效原因,补充一下。

到底为什么失效呢

比如有三个字段,A=, B>, C=. 最后只会走两个索引 A 和 B 的,并不能找到唯一的记录。

看来面试的时候猜到了一点。就是三个字段先从 A 字段开始匹配,找到某个节点对应的记录后,下到第二层对应的 A 字段相等的节点上,然后 B 字段就从 B 字段这个层往后查询,因为是范围查询吗,没有机会往下走去找 C 字段(不是精确值,下不去)。所以最后能查询的数据不是唯一的,而是很多数据,这时候索引就走不全了。(B+树联合索引的存储结构得看看,还有记录在节点中的存储情况)

然后呢,由于没有查到需要的 C 字段,所以会进行回表查询,而且是大量的回表查询,那这时候 Mysql 不是在执行 SQL 的时候有一个优化器吗,它发现走索引然后进行回表的开销,比全表扫描更大。所以它就不走索引,而是通过全表扫描来进行查询。也就是说联合索引失效了。


文章作者: KTpro
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 KTpro !
评论
  目录