首页/数据/SQL 速查/基数与区分度:索引值不值得
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条变更与事务52 条
性能与执行计划72 条

基数与区分度:索引值不值得

Cardinality 是索引列不同值的估算数:区分度低(性别、状态)的单列索引帮助有限,组合列或改写更有效。

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

示例

示例
SHOW INDEX FROM orders;
-- 观察 Cardinality 列:与分析表统计相关,可用 ANALYZE TABLE 更新

-- 低区分度列的单列索引收益有限
SELECT * FROM orders WHERE status = 'paid';   -- status 只有几个取值

-- 组合出更高区分度:user_id + status
ALTER TABLE orders ADD INDEX idx_user_status (user_id, status);
Cardinality不同值的估算数量,近似值
区分度基数与总行数之比;越接近 1 越适合做索引前导列
更新方式ANALYZE TABLE 重新采样;采样页数与 innodb_stats_persistent_sample_pages 相关
区分度是相对量:同一列在不同数据分布下结论可能不同,以实际查询的选择性为准。

易错点

  • 把 Cardinality 当精确值:它是抽样估算,数据变化后会不准,需要 ANALYZE 或等待自动更新
  • 给每个过滤列各建一个单列索引:低区分度列效果有限,复合索引或改写通常更有效

数据来源与参考

  • MySQL 8.0 Reference Manual §8.3.1 How MySQL Uses Indexes
  • PostgreSQL Documentation §14.2 Statistics Used by the Planner
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌