索引的选择性是指索引列不同值数量与总行数的比值,范围0–1;越接近1区分度越高,越接近0重复越多、效率越低;低选择性字段(如status、gender)不宜单独建索引,但可作为高选择性列后的联合索引后缀。
什么是索引的选择性(selectivity)
索引的选择性,指的是索引列中不同值的数量与该列总行数的比值,即 SELECT COUNT(DISTINCT col) / COUNT(*) FROM table。它的取值范围是 0 到 1:越接近 1,说明该列重复值越少,索引区分度越高;越接近 0,说明大量重复(比如性别、状态字段),索引效率越低。
为什么低选择性字段不适合单独建索引
MySQL 的 B+ 树索引在查找时依赖“跳过无关分支”的能力。如果 col 有 95% 的值都是 'active',那么查询 WHERE col = 'active' 仍需扫描全表约 95% 的叶子节点——此时走索引反而比全表扫描更慢(额外多了树遍历和回表开销)。
- 常见低选择性字段:
is_deleted、status(只有 2–3 个枚举值)、gender - MySQL 优化器通常会拒绝使用这类索引,执行计划里
key字段为NULL,type是ALL - 即使强制用
FORCE INDEX,实际性能往往更差
如何判断和测量某列的选择性
别只看直觉,用 SQL 算出来最准。注意:对大表要加 LIMIT 或采样估算,避免全表扫描卡住。