直接回答:最左前缀原则指联合索引 (a, b, c) 的 B+ 树按从左到右的列顺序排序,查询条件必须从最左列开始连续匹配,索引才能用于定位。它能支持 a、(a,b)、(a,b,c) 三种前缀查询;跳过 a 直接用 b,或 a 用了范围查询后,右边的列就只能过滤不能用于定位。
展开解析:本质原因是排序规则:索引先按 a 排,a 相同才按 b 排——跳过 a 后 b 在全局无序,无法二分定位。要点:
- 等值列顺序无关:WHERE b=? AND a=? 优化器会重排,只要最左列出现在条件里即可。
- 范围查询(>、BETWEEN、LIKE '%x' 前缀之外的形式)会中断后续列的索引定位,但 MySQL 5.6+ 的索引下推可在引擎层继续用索引列过滤。
- 建索引时把等值列放前、范围列放后;高选择性列优先的说法要结合查询模式,别教条。
-- 索引 (a,b,c)
WHERE a=1 AND b=2 -- 用到 a,b
WHERE b=2 -- 用不上(跳过 a)
WHERE a=1 AND b>2 AND c=3 -- a 定位,b 范围,c 只能过滤
追问方向:索引下推、跳跃扫描(MySQL 8 的 skip scan)。