主题
面试速答(先看这里)
**一句话结论:**通过以上表格,你会发现,只有条件中包含 A 的才能走索引,不包含A 的都不能走索引。
60秒标准回答:
在不考虑 MySQL 8.0中的索引跳跃扫描(先别管是啥,后文有介绍)的情况下,走索引情况如下
通过以上表格,你会发现,只有条件中包含 A 的才能走索引,不包含A 的都不能走索引。原因就是因为最左前缀匹配
A,B,C 三个字段创建的联合索引,A 字段在最左边,其次是 B,在其次才是 C,所以,按照最左前缀匹配的原则,想要走索引,至少要先 match 上最左边的 A
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**在不考虑 MySQL 8.0中的索引跳跃扫描(先别管是啥,后文有介绍)的情况下,走索引情况如下:
- **要点2:**A,B,C 三个字段创建的联合索引,A 字段在最左边,其次是 B,在其次才是 C,所以,按照最左前缀匹配的原则,想要走索引,至少要先 match 上最左边的 A。
- **要点3:**在命中了 A 的情况下, AB 相比于 AC 的性能要更好一些 ,因为他能用到 A 和 B两个字段的索引,而 AC 只能用上 A,而用不上 C,因为他跳过了 B。
- **要点4:**然后,还有就是 AB 和BA 是一样的,where 条件中的先后顺序,不影响索引的使用。
**记忆锚点:**个字段创建的联合索引 → 的都不能走索引 → 两个字段的索引 → C的联合索引 → 的才能走索引 → MySQL
关键取舍:
- 在命中了 A 的情况下, AB 相比于 AC 的性能要更好一些 ,因为他能用到 A 和 B两个字段的索引,而 AC 只能用上 A,而用不上 C,因为他跳过了 B。
易错提醒:
- 在不考虑 MySQL 8.0中的索引跳跃扫描(先别管是啥,后文有介绍)的情况下,走索引情况如下: 通过以上表格,你会发现,只有条件中包含 A 的才能走索引,不包含A 的都不能走索引。
追问准备:
- 围绕「个字段创建的联合索引」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「的都不能走索引」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「两个字段的索引」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
在不考虑 MySQL 8.0中的索引跳跃扫描(先别管是啥,后文有介绍)的情况下,走索引情况如下:
| 查询条件 | 是否走索引 |
|---|---|
| A | 能走 |
| B | 不走 |
| C | 不走 |
| AB | 能走 |
| AC | 能走 |
| BC | 不走 |
| ABC | 能走 |
| BA | 同 AB |
| CA | 同 AC |
| CB | 同 BC |
| BAC | 同 ABC |
| CBA | 同 ABC |
通过以上表格,你会发现,只有条件中包含 A 的才能走索引,不包含A 的都不能走索引。原因就是因为最左前缀匹配。
A,B,C 三个字段创建的联合索引,A 字段在最左边,其次是 B,在其次才是 C,所以,按照最左前缀匹配的原则,想要走索引,至少要先 match 上最左边的 A。
在命中了 A 的情况下,AB 相比于 AC 的性能要更好一些,因为他能用到 A 和 B两个字段的索引,而 AC 只能用上 A,而用不上 C,因为他跳过了 B。
然后,还有就是 AB 和BA 是一样的,where 条件中的先后顺序,不影响索引的使用。