贝利信息

mysql索引选择性与查询效率的关系

日期:2026-01-14 00:00 / 作者:P粉602998670
索引选择性低(如性别字段)易致全表扫描,因优化器认为回表开销大于遍历全表;选择性=COUNT(DISTINCT col)/COUNT(*),低于0.05~0.1时B+树索引常失效;需结合最左前缀、NULL处理、覆盖索引及EXPLAIN综合判断。

索引选择性低会导致全表扫描

WHERE 条件列的选择性很低(比如性别字段只有 '男'/'女' 两种值),MySQL 优化器很可能放弃使用该索引,直接走全表扫

描。因为回表或扫描索引本身开销可能比遍历整张表还大。

联合索引的最左前缀原则直接影响选择性判断

MySQL 只能利用联合索引的连续前缀部分。即使 (a, b, c)a 选择性差,但 (a, b) 组合选择性高,查询 WHERE a = ? AND b = ? 仍可高效命中索引。

NULL 值会破坏索引选择性统计准确性

MySQL 的 ANALYZE TABLE 在统计列基数(Cardinality)时,对含大量 NULL 的列可能严重低估实际区分度,导致优化器误判索引价值。

覆盖索引能绕过选择性瓶颈提升效率

即使筛选字段选择性低,只要查询所需所有字段都在索引中(即覆盖索引),MySQL 就无需回表,此时哪怕走 index 类型扫描,性能也远好于全表扫描。

EXPLAIN SELECT id, create_time FROM orders WHERE status = 'shipped';
索引选择性不是独立指标,它和查询模式、字段顺序、NULL 分布、是否覆盖紧密耦合。单独优化某列的选择性没意义,得结合 EXPLAIN 输出和实际慢查询场景一起看。