我在一个系统的线上版本上遇到了性能问题,但是我无法在本地复现这个问题。
通过比较几个数据库EXPLAIN结果,我发现在线上版本中某些地方没有使用多字段索引,而在本地版本中有使用。进一步调查发现,这些索引在线上版本上的基数为NULL。
我猜测这是问题所在,但空值基数表示什么意思?会导致索引未被使用吗?优化可以解决此问题吗?如何防止其再次出现?由于我无法完全访问线上MySQL数据库,因此分析和优化超出了我的正常能力范围。
非常感谢任何回复!
我在一个系统的线上版本上遇到了性能问题,但是我无法在本地复现这个问题。
通过比较几个数据库EXPLAIN结果,我发现在线上版本中某些地方没有使用多字段索引,而在本地版本中有使用。进一步调查发现,这些索引在线上版本上的基数为NULL。
我猜测这是问题所在,但空值基数表示什么意思?会导致索引未被使用吗?优化可以解决此问题吗?如何防止其再次出现?由于我无法完全访问线上MySQL数据库,因此分析和优化超出了我的正常能力范围。
非常感谢任何回复!
在MyISAM表的索引上出现NULL基数时,是在创建表(或截断)并填充数据后发生的。加载之后,用户必须执行“分析表x”才能有效地获得该表的基数。在InnoDB表中存在类似的问题,需要定期执行“分析表x”以确保最佳的索引性能。MySQL数据库引擎不会自动更新索引基数,除了单列主键的情况。
对于MySQL来说,非NULL基数是至关重要/必需的,以利用该索引。
关于基数的一点说明:它是字段唯一性的度量标准。越唯一(高值),在该字段上的索引就越有效,并且会触及较少的记录。 NULL基数与0(零)基数不同。阅读本文:SHOW INDEX
-- JJ --