联合索引字段顺序必须从左到右连续匹配,因B+树按定义顺序全局排序;跳过左列、不从最左开始或前导模糊查询均导致索引失效;高频等值字段靠左,范围查询字段靠右,并需用EXPLAIN验证。

联合索引的字段顺序不是随意排的,它直接决定哪些查询能走索引、哪些会失效。核心就一条:MySQL 只能从联合索引最左边的列开始,连续地匹配条件,中间不能跳过,也不能倒着来。
为什么必须从最左开始?
因为联合索引本质上是一棵 B+ 树,数据按定义顺序整体排序:先按第一列升序,第一列相同时再按第二列升序,以此类推。这就意味着:
- 第一列在整个索引中是全局有序的
- 第二列只在第一列值相同的数据块内有序
- 第三列只在前两列都相同的子块内有序
如果查询不带第一列(比如只查 age = 25),数据库根本不知道该从树的哪个分支往下找——因为 age=25 的记录可能分散在 name='张三'、name='李四' 等不同分支里,只能全表扫描。
哪些查询能用上联合索引 (a, b, c)?
能用上的,必须满足“连续、从左起”:
- WHERE a = 1 → 用到 a
- WHERE a = 1 AND b = 2 → 用到 a、b
- WHERE a = 1 AND b = 2 AND c = 3 → 全部用上
- WHERE a = 1 AND b > 2 AND c = 3 → a 和 b 有效,c 失效(范围查询后中断)
- WHERE a = 1 ORDER BY b → a 用于过滤,b 用于排序,无需额外排序操作
哪些查询会失效?
常见断点有三类:
- 跳过中间列:WHERE a = 1 AND c = 3 → b 缺失,c 无法定位,只有 a 生效
- 不从最左开始:WHERE b = 2 OR WHERE b = 2 AND c = 3 → 完全不走索引
- 前导模糊匹配:WHERE name LIKE '%三' → 破坏最左顺序,索引失效;而 WHERE name LIKE '张%' 是有效的
字段顺序怎么定才合理?
不能只看单个字段的区分度高低,得看实际查询模式:
- 高频等值查询字段优先靠左(如 user_id、status)
- 范围查询字段(>、
- 排序或分组字段若常与等值条件组合,可顺势接在等值列之后(如 WHERE a = ? ORDER BY b)
- 如果经常查 WHERE status = 'paid' AND user_id IN (…),那 (status, user_id) 比 (user_id, status) 更高效
最终是否生效,一定要用 EXPLAIN 看 key_len 和 type 字段验证,别凭感觉。










