B+树结构依赖于最左列的值作为比较起点
MySQL的InnoDB引擎使用B+树存储索引数据。联合索引的键值按从左到右的顺序逐层排序。例如,联合索引(A, B, C) 的B+树结构如下
第一层:按 A 列排序;
第二层:在 A 相同的情况下按 B 排序;
第三层:在 A 和 B 相同的情况下按 C 排序
A.如果查询条件跳过最左列 A(如 WHERE B=1 或 WHERE C=1),MySQL 无法从 B+树的根节点开始逐层定位数据,因为索引的层级结构依赖于最左列的值作为起点。此时,优化器会放弃索引,转而进行全表扫描
B.索引的排序基于最左列的连续性,中间列的缺失会导致后续列的存储顺序无法被有效利用。例如,若跳过 B,即使 A=1 匹配,C 的查询仍需遍历所有 A=1 的数据,无法通过索引快速定位
C.如果查询条件中对某一列使用 范围查询(如 >、<、BETWEEN),其右侧的列将无法使用索引。例如:索引 (A, B, C),查询 WHERE A=1 AND B>2 AND C=3,则 C 列的索引失效
查询优化器
MySQL 的查询优化器在生成执行计划时,会优先选择 最小化扫描范围 的索引。若不满足最左匹配原则,优化器会认为使用索引的代价高于全表扫描,从而放弃索引
例外情况:索引覆盖与查询重写
在特定场景下,即使不满足最左匹配原则,索引仍可能被部分使用:
索引覆盖:若查询的列完全包含在索引中(如 SELECT A),即使跳过中间列,也可能通过索引扫描(type=index)而非全表扫描完成
优化器重写:若查询条件顺序与索引不一致(如 WHERE B=2 AND A=1),优化器会自动调整顺序为 A=1 AND B=2,从而命中索引