如果有一个 a,b 两个字段的联合索引,然后用 a 查询 b,正常来讲是可以走到索引覆盖的,那么如果没走到,可能的原因有以下几个:
1、索引中,a 并不在最左边,有可能是 b,a 这样的顺序,那么按照 a 查询,就会因为未遵循最左前缀匹配而无法直接用到索引查询。
2、如果 a 在最左边,但是因为用到了函数、或者是类型不一致,比如 a 是 varchar 类型,但是查询的字段是 int 类型,那么就会导致索引失效,这时候也无法进行索引覆盖了。
3、有长事务在操作同一条记录可能会无法走索引覆盖。在下面这篇文章中,我们介绍过,二级索引页有一个 PAGEMAXTRX_ID,如果他太新,或者如果二级索引中的记录被删除标记, InnoDB可能需要使用聚集索引来查找记录。详细的内容见: