【问题标题】:Is NULL cardinality in an index a problem - MySQL 5.x索引中的 NULL 基数是否存在问题 - MySQL 5.x
【发布时间】:2026-01-19 15:50:01
【问题描述】:

我在无法在本地复制的系统的实时版本中遇到性能问题。

在将我的本地数据库副本与实时数据库副本上的一些 EXPLAIN 结果进行比较时,我注意到多字段索引未在实时的某些地方使用,而是在本地使用,进一步调查表明,这些索引具有实况中的 NULL 基数。

我猜这是问题所在,但是 NULL 基数是什么意思,它会导致索引不被使用吗? Optimize 会解决这个问题吗?有没有办法防止它再次发生?我没有对实时 MySQL 数据库的完全访问权限,因此分析和优化超出了我的正常能力。

非常感谢您的回复!

【问题讨论】:

标签: mysql null indexing cardinality


【解决方案1】:

在创建(或截断)表并填充数据时,MyISAM 表的索引上会出现 NULL 基数。加载后,用户必须执行“分析表 x”以有效地获得该表的基数。 InnoDB 表中存在类似问题,需要定期执行“分析表 x”以确保最佳索引性能。 MySQL 数据库引擎不会自动更新索引基数,单列主键除外。

非 NULL 基数对于 MySQL 使用该索引至关重要/必需。

关于基数的一点:它是一个字段唯一性的度量。越独特(值越高),该字段上的索引就越有效,并且会触及更少的记录。 NULL 基数与 0(零)基数不同。
阅读:SHOW INDEX

-- JJ--

【讨论】:

    【解决方案2】:

    根据 fsb 的有用发现,我猜您正在使用 MyISAM,并建议您迁移到 InnoDB,它多年来一直被认为是一种卓越的表引擎。

    InnoDB 的众多功能之一是automatic maintenance of indexes

    【讨论】:

      最近更新 更多