查询语句:select * from table where a=? and b> ? and c=?
字段a和b能命中索引,c无法命中索引,但是字段c的条件可以通过 “索引下推”过滤。
- 联合索引
(a, b, c)的结构决定了先匹配a,再匹配b,最后是c。 - 由于
b使用了范围查询(b> ?),范围查询会中断索引的进一步使用。也就是说,一旦遇到范围查询,索引只能用到该字段为止。因此b会命中索引,但索引的使用会在这里中断。c无法直接使用索引进行匹配。 - 但开启索引下推后,在存储引擎在遍历索引时,会同时检查
c=?的条件,直接过滤掉不满足c=?的记录,最后把数据返回给 Server 层,而无需将这些记录回表查询完整数据后再过滤。
虽然c不参与索引的范围定位,但通过索引下推,c=?的条件会在存储引擎的索引层面被提前过滤,减少了回表的记录数,提高查询效率。