联合索引遵循最左匹配原则,即查询条件必须从索引最左字段开始连续使用,跳过中间字段或无最左字段则索引失效;范围查询会截断右侧字段的索引能力;where条件顺序不影响匹配,但逻辑需构成最左连续前缀。

联合索引要满足最左匹配原则,关键在于查询条件必须从索引定义的最左侧字段开始,并且中间不能跳过任何列——只要连续、不中断、不越界,就能用上索引。
必须包含最左字段
联合索引 (a, b, c) 的生效起点永远是 a。没有 a 的条件,b 或 c 单独出现,索引完全不走。
-
✅ 能用索引:
WHERE a = 1、WHERE a = 1 AND b = 2、WHERE a = 1 AND b = 2 AND c = 3 -
❌ 完全失效:
WHERE b = 2、WHERE c = 3、WHERE b = 2 AND c = 3
中间字段不能跳过
即使写了最左字段,如果跳过了中间列,后续字段也无法利用索引。
-
✅ a 和 b 都用上:
WHERE a = 1 AND b = 2 -
⚠️ 只有 a 用上,c 无效:
WHERE a = 1 AND c = 3(b 缺失,c 不再参与索引过滤)
范围查询会截断右侧字段
一旦某个字段用了范围操作(>、、<code>BETWEEN、LIKE 'abc%'),它右边所有字段都失去索引能力。
-
✅ a 和 b 有效:
WHERE a = 1 AND b > 10 -
⚠️ c 完全无效:
WHERE a = 1 AND b > 10 AND c = 5 -
⚠️ 即使是等值,也挡不住:
WHERE a = 1 AND b LIKE 'x%' AND c = 7→ c 不走索引
条件顺序不影响匹配,但逻辑必须成立
MySQL 查询优化器会自动重排 WHERE 子句顺序,所以 WHERE b = 2 AND a = 1 和 WHERE a = 1 AND b = 2 效果一样,都能走 (a,b,c) 的前两列。
- 真正起作用的是“实际参与过滤的字段是否构成最左连续前缀”,不是 SQL 里写的先后顺序
- 但要注意:
WHERE a = 1 OR b = 2这类逻辑不满足最左前缀,通常无法高效使用联合索引











