首页/数据/数据库速查/联合索引列顺序(最左前缀与排序法则)
性能与调优57 条

联合索引列顺序(最左前缀与排序法则)

联合索引列序记忆法则:等值条件放前、范围条件放后、排序/分组列顺延;跳过最左列(如只用 b 查 (a,b))整个索引用不上。

数据库速查数据更新于 2026-10-12

三种查询对照

三种查询对照
-- 索引 idx(user_id, status, created_at)
SELECT * FROM orders WHERE user_id=1 AND status=2;                 -- 用 user_id+status
SELECT * FROM orders WHERE user_id=1 AND created_at>'2026-01-01';  -- user_id + created_at 范围(跳过 status 但 created_at 仍可定位)
SELECT * FROM orders WHERE status=2;                               -- 用不上(无最左列)
最左前缀从索引第一列开始连续匹配才有效
范围截断范围列之后的列只能过滤不能定位
排序顺延WHERE 等值 + ORDER BY 后续列 = 免排序
「跳过中间列」后能否用后续列,取决于跳过的列是等值还是范围:等值可跳(8.0 索引跳跃扫描有限支持),范围不行。

易错点

  • 按直觉把低选择性列放最左:索引利用率与选择性双输
  • 范围条件列放中间:后续列全部退化为过滤,设计时把范围列排到等值列之后

数据来源与参考

  • MySQL 8.0 Reference Manual: Multiple-Column Indexes

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌