《MySQL系列-InnoDB引擎34》索引与算法-Cardinality值

Cardinality值

1 什么是Cardinality

并不是在所有的查询条件中出现的列都需要添加索引。对于什么时候添加B+树索引,一般的经验是,在访问表中很少一部分时使用B+树索引才有意义。对于性别字段、类型字段,取值范围很小,称为低选择性这时添加B+树是没有必要的。相反,如果某个字段取值范围很广,几乎没有重复,即属于高选择性。

Cardinality是指一个索引中不同值的数量,越大表示该索引在数据表中能够识别唯一行。在某些情况下,一个高cardinality的索引可以提高查询性能,例如在一个数据表中有一个唯一用户ID的列,那么对该列添加索引可以提高查询性能。但是在其他情况下,一个高Cardinality的索引会导致查询性能下降,例如在一个数据表中存储的列(只有男、女),对该列添加索引并不会提高查询性能。

因此在决定是否要对一个列建立索引时,需要综合考虑该列的cardinality、查询频率、数据表大小等因素。

2 InnoDB存储引擎的Cardinality统计

因为MySQL数据库有各种不同的存储引擎,而每种存储引擎对于B+树索引的实现又各不相同,所以对Cardinality的统计是放在存储引擎层进行的。

此外,在生产环境中,索引的更新操作是非常频繁的。如果每次索引在发生操作时就对其进行Cardinality的统计,那么将会给数据库带来很大的负担。另外需要考虑的是,如果一张表的数据非常大,如一张表有50G的数据,那么统计一次Cardinality信息所需要的时间非常长。在生产环境中,这种肯定是不能被接受的。因此,数据库对于Cardinality的统计都是通过采样的方法完成的。

一般情况下只要insert和update操作发生时,就会触发Cardinality更新,但是当表数据量大的时候,对数据库是有影响的。所以,Innodb存储引擎内部对更新Cardinality信息的策略为:

  • 表中1/16的数据已经发生变化
  • stat_modifed_counter>2 000 000 000

猜你喜欢

转载自blog.csdn.net/m0_51197424/article/details/129778488