什么是Cardinality值?
Cardinality值是Mysql做索引优化时一个非常关键的值,优化器会根据这个值来判断是否使用这个索引,它表示索引中唯一值的数目估计值,该值应该尽可能接近1,如果非常小,则用户需要考虑是否删除该列索引。但注意,这个值并不是准确的,它只是一个大概的值。
如何查询Cardinality值?
可以使用
show index from [table name]
来查看
Cardinality如何更新?
首先我们要知道如果一个表的数据很大,那么更新这个值的成本是很大的,所以我们不可能频繁的更新这个值。这个值是由InnoDB自身来维护的,Cardinality值统计信息的更新每次发生在Insert和Update语句后,当然它也不是每次更新和插入后都重新统计的,它的更新标准有两个:
- 表中1/16数据已经更新
- stat_modified_counter > 2000000000
对于第一个策略,它会在表自从上次更新Cardinality后表中1/16的数据发生变化后更新Cardinality值。第二个情况表示法僧你变化的次数。
满足上面条件后Cardinality就可以更新,其更新策略采用的是采样法,每次获取8个叶子结点,统计每个页不同记录的数目,然后根据采样的信息估计出Cardinality(这也说明了一个事实,重复获取Cardinality值结果可能不一样)。8这个采样数目是系统默认的,我们可以通过
innodb_stats_sample_pages
来修改采用数目。
此外类似于:ANALYZE TABLE
、SHOW TABLE STATUS
、SHOW INDEX FROM
以及INFORMATION_SCHEMA
架构下的TABLES和STATISTICS表被访问是都会更新这个值。