mysql 索引 区分度多少合适

mysql 索引 区分度多少合适,第1张

大部分开发会了解这样的《开发规范》:创建索引要选择区分度高的字段。他们会认为区分度低的字段不适合创建索引或者不适合添加到组合索引里面。但是这样的 *** 作会导致很多慢查。举例来说:

select  * from  tab where a=1 and b=2

场景 1

符合 a=1 的记录数有 10w 条记录 ,b=2 有 1000 条记录。如果只是创建 idx_a(a),sql 请求通过索引 idx_a 访问 10w 条件记录,然后还要逐一匹配 10w 条记录中的 status,找到符合 b=2 的记录。这个动作会导致慢查。如果创建组合索引 idx_ab(a,b),sql 请求通过索引 idx_ab 可以直接定位到 1000 条记录,无需额外的过滤。这样减少访问 9900 条记录的时间,提升查询速度。

场景 2

符合 a=1 的有 100 条记录,status=2 有 10 条记录。其实场景 2 因为数据量比较少,直接访问 100 条记录和定位到 10 条记录的时间消耗相差不大,量变不足以引发质变,可以忽略了。

Tips:1. 创建索引的目的是通过索引尽可能找到匹配 where 条件的行,减少不必要的回表,提高查询效率;2. 需要辩证地看待区分度比较低的字段在组合索引中的作用。在组合索引的情况下,我们不能只是单纯地看字段的区分度,而是要看符合条件的记录数是多少。符合条件的记录越少,性能越好。

最小为0.0000。

区分度的值越大,也就是数据不重复率越大,新建索引效果也越好。

在主键以及唯一键上面的区分度是最高的,为1.0000。

大部分开发会了解这样的《开发规范》:创建索引要选择区分度高的字段。他们会认为区分度低的字段不适合创建索引或者不适合添加到组合索引里面。但是这样的 *** 作会导致很多慢查。举例来说:

select  * from  tab where a=1 and b=2

场景 1

符合 a=1 的记录数有 10w 条记录 ,b=2 有 1000 条记录。如果只是创建idx_a(a),sql 请求通过索引idx_a访问 10w 条件记录,然后还要逐一匹配 10w 条记录中的 status,找到符合 b=2 的记录。这个动作会导致慢查。如果创建组合索引idx_ab(a,b),sql 请求通过索引idx_ab可以直接定位到 1000 条记录,无需额外的过滤。这样减少访问 9900 条记录的时间,提升查询速度。

场景 2

符合 a=1 的有 100 条记录,status=2 有 10 条记录。其实场景 2 因为数据量比较少,直接访问 100 条记录和定位到 10 条记录的时间消耗相差不大,量变不足以引发质变,可以忽略了。

Tips:

创建索引的目的是通过索引尽可能找到匹配 where 条件的行,减少不必要的回表,提高查询效率;

需要辩证地看待区分度比较低的字段在组合索引中的作用。在组合索引的情况下,我们不能只是单纯地看字段的区分度,而是要看符合条件的记录数是多少。符合条件的记录越少,性能越好。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8655172.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-19
下一篇 2023-04-19

发表评论

登录后才能评论

评论列表(0条)

保存