cardinality 在英语中的本意是基数,在MySQL中,可以理解为索引基数,这个概念代表了某个索引字段(包括复合索引)中不同数值(数值组合)的个数,相当于Distinct之后的结果。官网中举的是性别的例子,性别字段只有“男”或者“女”这两种可能的值,所以这个字段的cardinality 就是2。
selectivity可以被认为是选择度,是由cardinality 算出来的,公式是:
Selectivity of index = cardinality/(numberof rows) * 100%
也就是索引基数和总行数的比值,代表了索引列中数据的区别程度,因此这个值越接近100%,索引的效率越高,MySQL的优化器也更倾向于使用选择度更高的索引。
比如主键和唯一索引(不考虑NULL值)的选择度就是100%。
再比如官网中的性别的例子,比如一个性别字段添加了索引,在表里有1000行数据的情况下,Selectivity的值就是2/1000*100%=0.2%,可见这个索引的效率就会非常低,优化器一般也不会选择使用这个索引。
另外,网上有Selectivity大于17.1%就不使用索引的文章,那篇文章中的Selectivity和MySQL定义的Selectivity并不相同,那篇文章中的Selectivity实际上代表了MySQL成本模型中的一个常量row_evaluate_cost,这个值的系统默认值是20%。