主题
面试速答(先看这里)
**一句话结论:**如果有一个 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可能需要使用聚集索引来查找记录。详细的内容见: