您的位置:首页 > 数据库 > MySQL

mysql引擎InnoDB索引中的cardinality关键字

2016-08-20 10:41 441 查看
执行show index时,有一列叫做cardinality,这一列至关重要,如图



那么它是干啥的呢

一般我们在mysql中添加索引的时候,首先要选择创建索引的列,但并不是所有查询的列都要创建索引,我们是有一个标准的,就是要选择高选择性的列。当然也会有相对的低选择性列。

低选择性列:比如性别,地区这种字段,取值的范围比较小,称为低选择性,如果在这种列上添加索引,是完全没有意义的。

高选择性列:相对于低选择性,如果某个列取值范围很广。几乎没有 重复性,那么就是高选择性列,在这种列上边建索引,那是最合适的。

所以这里就引出了cardinality,它表示索引中不重复记录数量的预估值,这是一个预估值,而不是准确值,因为它是采样来的,实际中,也不可能得到准确的值,只要cardinality/rows_intabe值接近1,那么这列就适合建索引,相反,如果值接近0,那就要考虑这个索引是不是还有存在的必要。所以我们在访问高选择性字段并从中去除少量数据的时候,此列必建索引。

当然,更新cardinality值消耗是非常大的,InnoDB一般选择在下边两种情况更新cardinality信息

1.表中数据1/16数据发生变化

2.stat_modified_counter>2000000000

第一种好理解,表中数据发生变化就更新。但如果频繁对某一行数据更新,则第一种就不适合了,这时就是第二种了,它会对频繁更新某一行数据这种情况作出处理。

InnoDB是通过对8个叶子节点的采样来生成cardinality值的,所以这里就有两个问题:

1.采样值是不准确的

2.两次采样值可能不一样

当执行analyze table,show table status,show index时InnoDB会重新计算cardinality。但是切记,如果表中数据过多,且表上有多个辅助索引的时候,以上命令是非常耗时的。

cardinality比较少遇到,但却是很重要,适当的利用它,会有意想不到的效率哦
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息