等值查询字段必须放在组合索引最左侧,因B+树索引从左到右匹配;范围查询字段只能紧随等值字段之后且仅一个;ORDER BY/GROUP BY字段可追加索引末尾以避免文件排序;需用EXPLAIN验证key_len和Extra。

等值查询字段必须放组合索引最左边
MySQL 的 B+ 树索引从左到右依次匹配,WHERE a = 1 AND b = 2 能用上 (a, b, c) 索引,但 WHERE b = 2 就完全用不上——哪怕 a 在 WHERE 中没出现。这是因为索引结构不支持跳过前导列直接定位。
实操建议:
- 把所有
=或IN条件的字段优先左对齐排列 - 多个等值条件时,按区分度(高基数字段)从高到低排,比如
user_id(唯一)比status(几个枚举值)更适合作左首列 - 避免把低区分度字段(如
is_deleted)放在最左,否则索引失效风险高
范围查询字段只能放在等值字段之后,且只能有一个
>、、BETWEEN、LIKE 'abc%' 这类范围操作会中断索引下推。一旦遇到,右侧所有字段都无法参与索引查找(但仍可用于排序或覆盖索引)。
常见错误现象:
-
WHERE a = 1 AND b > 10 AND c = 5只能用上(a, b),c不参与索引查找(即使加了也查不到) -
WHERE b > 10 AND a = 1无法使用(a, b)索引——顺序错,连a都用不上 -
WHERE a > 1 AND b > 10只能用上a,b完全失效
所以组合索引中,范围字段必须紧接在所有等值字段之后,且只保留一个用于过滤(其余可留作排序或覆盖)。
ORDER BY 和 GROUP BY 字段可追加在索引末尾
如果查询带 ORDER BY a, b,而你已有等值条件 WHERE x = ?,那么索引设计成 (x, a, b) 可避免文件排序(Using filesort)。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
注意点:
- 排序方向需一致:
ORDER BY a ASC, b DESC无法利用(a, b)索引(5.7+ 支持混合方向,但需确认版本) -
GROUP BY同理,本质也是排序需求 - 不要为了覆盖排序强行把高频范围字段挪到末尾——它可能让前面的等值失效
EXPLAIN 验证时重点看 key_len 和 Extra
key_len 告诉你实际用了索引的前几列;Extra 里出现 Using where 是正常,但出现 Using filesort 或 Using temporary 就说明索引没覆盖排序或聚合逻辑。
快速验证方法:
- 执行
EXPLAIN SELECT ... WHERE ... ORDER BY ... - 对比
key_len是否符合预期(例如INT是 4 字节,VARCHAR(50)utf8mb4 是 200 字节) - 若
key_len明显偏小(比如本该用 3 列却只显示 1 列长度),大概率是范围查询位置不对或类型隐式转换导致索引截断
真正容易被忽略的是:字符集和 collation 不一致会导致等值匹配失败(如 utf8mb4_general_ci vs utf8mb4_unicode_ci),这时 = 也会退化为范围行为——连最左匹配都保不住。










