联合索引abc,请问查询哪些字段能命中索引

查询语句:select * from table where a=? and b> ? and c=?

字段ab能命中索引,c无法命中索引,但是字段c的条件可以通过 “索引下推”过滤。

  1. 联合索引(a, b, c)的结构决定了先匹配a,再匹配b,最后是c
  2. 由于b使用了范围查询(b> ?),范围查询会中断索引的进一步使用。也就是说,一旦遇到范围查询,索引只能用到该字段为止。因此b 会命中索引,但索引的使用会在这里中断。c无法直接使用索引进行匹配。
  3. 但开启索引下推后,在存储引擎在遍历索引时,会同时检查c=?的条件,直接过滤掉不满足c=?的记录,最后把数据返回给 Server 层,而无需将这些记录回表查询完整数据后再过滤。

虽然c不参与索引的范围定位,但通过索引下推,c=?的条件会在存储引擎的索引层面被提前过滤,减少了回表的记录数,提高查询效率。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计