联合索引 (A,B,C) 对 C,B,A 条件是否生效,最左前缀如何理解?

考查重点:条件书写顺序与索引前缀。最左前缀看索引定义顺序,AND条件写C/B/A仍可重排用ABC;缺A或范围后的定位能力才需具体分析

本题目录

参考答案

核心回答

如果条件只是写成 C=3 AND B=2 AND A=1,通常仍然可以利用 (A,B,C) 的三列等值前缀。最左前缀指的是索引定义中的列顺序,和这些 AND 条件在 WHERE 中的书写顺序没有直接关系。这里假设使用 MySQL 的普通 B-tree 联合索引,列和值类型适配,也没有给索引列额外套表达式。

(A,B,C) 按照 先 A、相同 A 内再按 B、相同 A 和 B 内再按 C 的顺序组织。因此,常规范围定位可以利用 (A)、(A,B)、(A,B,C) 这些连续的左前缀。缺少前面的列,后面的列就未必能直接确定一段连续的索引范围。

不过,“可以形成查找条件”和“优化器最终选择这个索引”还要分开:后者也取决于数据分布、返回行数、是否回表和其他可用索引的成本。

为什么最左前缀看索引列顺序?

把索引项简化成三元组,可能依次是 (1,1,9)、(1,2,1)、(2,1,1)。A 整体有序,但 B 单独看是 1、2、1,并没有全局排序。

知道 A 和 B,就容易找到它们对应的连续区间;只知道 B,则可能要到多个 A 分组中寻找。这也是 (A,B,C) 与 (B,A,C) 的访问能力不同的原因。一个联合索引支持多个左前缀,并不意味着它在存储、成本和访问能力上等同于三个独立索引。

几种条件分别怎样利用索引?

以下讨论 MySQL 8.4 中常规的联合索引范围定位;最终访问路径仍需结合执行计划。

  • A=1:可以利用第一列定位。
  • B=2 AND A=1:可以利用 (A,B),交换等值条件的书写位置不会让前缀断开。
  • C=3 AND B=2 AND A=1:可以利用完整的 (A,B,C) 等值前缀。
  • A=1 AND C=3:常规定位先确定 A 的范围。缺少 B 时,C 通常不能继续缩小这一连续查找范围,但仍可能在索引内过滤;适用时可通过索引下推减少回表,或由覆盖索引直接提供所需列。
  • B=2 AND C=3:缺少 A,不能直接按普通左前缀构造查找范围。不过,优化器仍可能选择全索引扫描;满足条件时,也可能采用跳跃扫描。不能只凭缺少 A 就断定一定全表扫描。
  • A=1 AND B>2 AND C=3:常规范围定位通常使用 A 和 B,到 B 的范围条件为止;C 仍可能参与后续过滤。>=、<=、BETWEEN 等也需要按范围构造规则分析,不能一概认为它们之后的列都能继续用于定位。

这里有三种不同作用:缩小访问范围、扫描时过滤、覆盖查询提供列值。看到执行计划用了某个索引,不能直接推断每一列都参与了范围定位,也不能据此断言扫描量很小。

常见追问

跳跃扫描为什么能处理缺少前导列的情况? 它可以枚举前导列的不同取值,在各分组中分别寻找后面的范围,避免直接扫描全部索引项。MySQL 8.4 对这种路径有具体限制,例如单表查询、索引覆盖所需列、谓词形式等;是否划算还取决于前导列不同值的数量和成本估算,因此它不能替代合理的索引设计。

建联合索引时,列顺序怎样选? 从实际查询最常使用的前缀出发,同时考虑等值过滤、范围查询、排序和覆盖需求。区分度是因素之一,但不能脱离查询模式,机械地把区分度最高的列放在最左边。

怎样确认某条 SQL 的实际情况? 在目标版本、表结构和数据分布下查看 EXPLAIN,结合选中的索引、访问方式、扫描行数估算和附加过滤信息判断。key_len 可以辅助分析,不能单凭它或“用了索引”就证明查询高效。

参考资料

相关面经

8 篇

极兔速递

后端开发工程师
一面
查看原面经 →
现在有一张表, A 字段跟 B 字段设置了一个联合索引。但是写的时候没注意,写反了,先写的 B 等于,然后 and A 等于,这时候这个索引能生效吗?

恒生电子

AI 应用开发工程师
校招秋招一面
查看原面经 →
追问
如果我有一个联合索引abc,查询条件是b等于1 and c等于2,这个查询能用到这个联合索引吗?

靖安科技

后端工程师(RAG/Agent 项目)
秋招一面
查看原面经 →
MySQL 最左前缀法则
追问
给 ABC 建联合索引,只查 B、C 会用这个索引吗

知乎

全栈开发工程师
秋招一面
查看原面经 →
联合索引前缀法则

顺丰

Java 开发工程师
秋招一面
查看原面经 →
联合索引的底层 怎么走索引
展开剩余 3 篇面经

小红书

AI Native 全栈开发工程师
日常实习一面、二面
查看原面经 →
联合索引 (A,B,C),查询条件 C,B,A 是否走索引

去哪儿

AI 应用开发工程师
查看原面经 →
和B有什么区别、为什么有最左前缀原则、计算最大行数

知乎

后端开发
实习一面
查看原面经 →
数据库最左索引原则以及例子分析

相关题目

4 题