贝利信息

mysql联合索引怎么用才正确_mysql索引规则解析

日期:2026-01-06 00:00 / 作者:P粉602998670
联合索引仅支持最左前缀匹配:a=1、a=1 AND b=2、a=1 AND b=2 AND c=3可走索引;b=2或a=1 AND c=3则无法充分利用。字段顺序应按选择性与查询模式排列,高区分度字段靠左,排序字段靠右。

联合索引能用上的查询条件长什么样?

只有满足「最左前缀匹配」的 WHERE 条件,才能真正走 INDEX(a, b, c) 这类联合索引。不是“包含这些字段就行”,而是必须从最左边开始、连续使用。

注意:MySQL 查询优化器会自动调整 WHERE 子句中字段顺序(比如把 b = 2 AND a = 1 改成 a = 1 AND b = 2),但前提是所有字段都在同一层级且无函数/计算干扰 —— 别依赖它来“救场”,自己写对才是稳的。

联合索引字段顺序怎么排才不翻车?

顺序不是按字母或出现频率排,而是按「选择性」和「查询模式」定:高区分度字段放前面,高频过滤字段靠左,排序/分组字段尽量靠右。

验证选择性:可用 SELECT COUNT(DISTINCT col)/COUNT(*) FROM table 粗估;值越接近 1,该列越适合作为联合索引首列。

为什么加了联合索引,EXPLAIN 还显示 type=ALL 或 Using filesort?

EXPLAINtype=ALL 表示全表扫描,Extra: Using filesort 表示 MySQL 没法用索引完成排序 —— 这两类问题往往不是没建索引,而是索引没被“完整驱动”。

关键点:范围查询(>, , BETWEEN, LIKE 'abc%')之后的字段,只能用于索引查找,不能用于排序或精确匹配。

什么时候该用联合索引,而不是多个单列索引?

当你的高频查询同时命中多个字段,且存在固定组合时,联合索引几乎总是优于多个单列索引 —— 因为 MySQL 一般一次只用一个索引(除非开启 index_merge,但代价高、不可控)。

SELECT * FROM orders WHERE user_id = 123 AND status = 'paid' AND created_at > '2025-01-01';

别忘了删冗余索引:比如已有 INDEX(a, b, c),再单独建 INDEX(a)INDEX(a, b) 就是浪费 —— 写入开销白增,优化器还可能选错。