前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从根上理解为什么说索引的离散型越高越好?

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

作者头像
业余草
发布2019-07-10 14:50:34
1.3K1
发布2019-07-10 14:50:34
举报
文章被收录于专栏:业余草业余草

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

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

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

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

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

640
640

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

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

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

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年07月09日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档