从根上理解为什么说索引的离散型越高越好?

SQL herman 301浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

昨天的那篇文章中,我留了一个问题:“为什么说索引的离散型越高越好?”今天我们就一起从根上理解它!

还是那句话,任何问题,要知其然,还要知其所以然。希望通过这篇文章的讲解,你能明白两个问题。一个问题就是索引离散型;还有一个问题就是 like 查询问题,其实 like ‘xttblog%’ 也不一定走索引的。

WHERE 条件中,like ‘xttblog%’, like ‘%xttblog%’, like ‘%xttblog’,三种方式查询方式,后两种方式对于索引是无效的,有索引也不会走索引。第一种 ‘xttblog%’ 是不确定的,决定于列的离散型,理论上讲可以用到,如果发现离散情况特别差的情况下,查询优化器觉得走索引查询性能更差,还不如全表扫描。所以,关于 like 查询其实很多人也是有误解的!

离散型的好坏,决定着优化器是否走索引。

假设我们现在有一个状态字段 status,它的离散型非常的差,那么对它建立索引,对应的索引树,举例如下:

SQL 索引离散型好坏影响查询

你看我这个例子,status 字段的索引离散型非常的差,如果此时搜索 status = 1 的数据,根节点判断的时候,结果是查询左子树,但是当在左子树第二层再进行判断的时候,因为左右分支都满足条件,所以很难抉择选择哪一个分支继续搜索,或者是把两个分支同时进行搜索。

如果是范围查询还好一点,因为所有的叶子节点都是有顺序的。我从最左边开始,一直遍历到不符合条件的第一条数据为止,把数据返回。这是 B+ 树的一个特点,有序性更强!
但是呢?由于离散型非常的差,优化器可能直接就选择不走索引了,因为优化器可能认为,走索引和全表扫描差不多。

所以,我们再创建索引时,一定要选择重复值较低的字段。

离散型有一个计算公式:count(distinct col):count(col),离散型越高,选择型越好。

以上,希望能够帮助大家解惑!知识点虽小,但是能讲明白的,少之又少!

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号1:xmtxtt(5000人已满),微信号2:codedq(5000人已满),微信号3:xttblog(超2800)。备注:“xttblog”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » 从根上理解为什么说索引的离散型越高越好?