Skip to content

面试速答(先看这里)

**一句话结论:**如果有一个 a,b 两个字段的联合索引,然后用 a 查询 b,正常来讲是可以走到索引覆盖的,那么如果没走到,可能的原因有以下几个:

60秒标准回答:

如果有一个 a,b 两个字段的联合索引,然后用 a 查询 b,正常来讲是可以走到索引覆盖的,那么如果没走到,可能的原因有以下几个

1、索引中,a 并不在最左边,有可能是 b,a 这样的顺序,那么按照 a 查询,就会因为未遵循最左前缀匹配而无法直接用到索引查询

2、如果 a 在最左边,但是因为用到了函数、或者是类型不一致,比如 a 是 varchar 类型,但是查询的字段是 int 类型,那么就会导致索引失效,这时候也无法进行索引覆盖了

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**1、索引中,a 并不在最左边,有可能是 b,a 这样的顺序,那么按照 a 查询,就会因为未遵循最左前缀匹配而无法直接用到索引查询。
  • **要点2:**2、如果 a 在最左边,但是因为用到了函数、或者是类型不一致,比如 a 是 varchar 类型,但是查询的字段是 int 类型,那么就会导致索引失效,这时候也无法进行索引覆盖了。
  • **要点3:**3、有长事务在操作同一条记录可能会无法走索引覆盖。

**记忆锚点:**PAGE_MAX_TRX_ID → 无法走索引覆盖什么原因 → 配而无法直接用到索引 → 记录可能会无法走索引 → 两个字段的联合索引 → 那么就会导致索引

加分表达:

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

追问准备:

  • 围绕「PAGE_MAX_TRX_ID」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「无法走索引覆盖什么原因」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「配而无法直接用到索引」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

如果有一个 a,b 两个字段的联合索引,然后用 a 查询 b,正常来讲是可以走到索引覆盖的,那么如果没走到,可能的原因有以下几个:

1、索引中,a 并不在最左边,有可能是 b,a 这样的顺序,那么按照 a 查询,就会因为未遵循最左前缀匹配而无法直接用到索引查询。

2、如果 a 在最左边,但是因为用到了函数、或者是类型不一致,比如 a 是 varchar 类型,但是查询的字段是 int 类型,那么就会导致索引失效,这时候也无法进行索引覆盖了。

3、有长事务在操作同一条记录可能会无法走索引覆盖。在下面这篇文章中,我们介绍过,二级索引页有一个 PAGE_MAX_TRX_ID,如果他太新,或者如果二级索引中的记录被删除标记, InnoDB可能需要使用聚集索引来查找记录。详细的内容见:

📄 ✅二级索引在索引覆盖时如何使用MVCC?

打开文档:✅二级索引在索引覆盖时如何使用MVCC?