MySQL 索引的区分度之性能分析

对于选择性不高的列甚至可以不创建索引。如果选择性不高,极端性情况下可能会扫描全部或者大多数索引,然后再回表,这样反而增加了io 的消耗,这个过程可能不如直接走主键索引性能高。

索引列的选择往往需要根据具体的业务场景来选择;

但是需要注意的是索引的区分度越高则价值就越高,意味着对于检索的性价比就高。

索引的区分度等于count(distinct 具体的列) / count(*),表示字段不重复的比例。

唯一键的区分度是1,而对于一些状态值,性别等字段区分度往往比较低,在数据量比较大的情况下,甚至有无限接近0。

        假设一张表中用status来表示数据的状态,1-有效,2-删除,则数据的区分度为 1/500000。如果100万条数据中只有1条被删除,并且在查询数据时查找status = 0 的数据时,需要进行全表扫描。由于索引也是需要占用内存的,所以在内存较为有限的环境下或者为了提高性能的情况下,区分度不高的索引几乎没有意义。

可通过下图是一个区分度不高的索引查询数据的过程来理解下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值