MySQL中的cardinality 和selectivity

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%。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值