如何决定是否需要创建索引_数据区分度与基数Cardinality计算

张开发
2026/4/19 1:24:16 15 分钟阅读

分享文章

如何决定是否需要创建索引_数据区分度与基数Cardinality计算
索引是否有效取决于Cardinality值高低接近总行数≥95%说明区分度高适合建索引10%则单列索引意义不大低区分度字段应置于联合索引后缀如(created_at, status)并用EXPLAIN验证实际使用情况。索引有没有用先看 Cardinality 值够不够高MySQL 的 SHOW INDEX FROM table_name 里那个 Cardinality 字段不是“有多少行”而是“该列值大概有多少个不同取值”。它直接影响优化器是否愿意走索引。如果 Cardinality 只有几百而表有百万行那这个索引大概率被忽略——因为扫描索引再回表比直接全表扫还慢。Cardinality 接近表总行数比如 95% 以上说明这列区分度高适合建索引如果 Cardinality 小于总行数的 10%基本可以判定加单列索引意义不大注意Cardinality 是采样估算值执行 ANALYZE TABLE table_name 可刷新但不会实时更新区分度低的字段硬加索引反而拖慢写入比如 status 只有 active、inactive、pending 三个值就算加上索引查询时优化器大概率走全表扫描更麻烦的是每次 INSERT/UPDATE 都要维护这个索引 B 树写放大明显。常见陷阱给布尔型、枚举型、状态码字段单独建索引却不结合查询条件中的其他过滤字段替代方案把低区分度字段放在联合索引的**后缀位置**比如 (created_at, status)靠前缀 created_at 拉高整体选择性验证方法用 EXPLAIN 看 type 是否为 ref 或 range而不是 ALL联合索引的顺序怎么排看 WHERE 条件里的等值匹配和范围查询索引生效不只看有没有更看字段在 WHERE 中的使用方式。MySQL 只能高效利用索引的最左前缀一旦遇到范围查询、BETWEEN、LIKE abc%后面的字段就失效了。 文小言 百度旗下新搜索智能助手有问题问小言。

更多文章