执行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比较少遇到,但却是很重要,适当的利用它,会有意想不到的效率哦