首页/数据/SQL 速查/联合索引的前缀使用规则
性能与执行计划72 条

联合索引的前缀使用规则

复合索引 (a,b,c) 只有从 a 开始连续使用才能有效:跳过前导列、或在中间列用范围,都会截断后续列的索引查找。

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

示例

示例
ALTER TABLE orders ADD INDEX idx_abc (user_id, status, created_at);

-- 能用到:a / a+b / a+b+c
SELECT * FROM orders WHERE user_id = 100;
SELECT * FROM orders WHERE user_id = 100 AND status = 'paid';
SELECT * FROM orders WHERE user_id = 100 AND status = 'paid' AND created_at > '2024-01-01';

-- 不能高效用到(未从 a 开始)
SELECT * FROM orders WHERE status = 'paid';
-- 中间列范围:created_at 条件仍可过滤,但不会再进入索引查找
SELECT * FROM orders WHERE user_id = 100 AND status > 'p' AND created_at > '2024-01-01';
等值优先设计索引时把等值条件列放前面、范围列放后面
范围截断某列用范围后,后续列无法继续用于索引定位(可能靠 ICP 过滤)
验证用 key_len 推断实际用到前几列

易错点

  • 按查询条件的书写顺序随意建索引:列顺序决定可用性,等值列在前通常更通用
  • 忽略范围截断:status > 'p' 之后的 created_at 不能靠索引定位,EXPLAIN 里 key_len 会提前截止

数据来源与参考

  • MySQL 8.0 Reference Manual · Range Optimization
  • MySQL 8.0 Reference Manual §8.8.2 EXPLAIN Output Format
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌