Skip to content

面试速答(先看这里)

**一句话结论:**通过以上表格,你会发现,只有条件中包含 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 条件中的先后顺序,不影响索引的使用。

📄 ✅where条件的顺序影响使用索引吗?

打开文档:✅where条件的顺序影响使用索引吗?

扩展知识 ​

📄 ✅什么是索引跳跃扫描

打开文档:✅什么是索引跳跃扫描