专栏首页业余草从根上理解为什么说索引的离散型越高越好?

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

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

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

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

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

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

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

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

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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • nginx配置详解

    nginx大家都听说过吧,我就不详细介绍了。我这里就列一下,nginx中nginx.conf配置文件每个配置项的详细解释。

    业余草
  • 关于sql语句的优化

    最近在做mysql的数据库优化以及对sql语句优化的指导,写了一点文档,这个大家共勉一下!

    业余草
  • SCRUM敏捷开发规则一栏

    敏捷、敏捷开发这类词最近很火!敏捷开发,就是指能够在需求迅速变化的情况下快速开发软件。我们接触最多的和敏捷相关的名词是:极限编程(XP)、结对编程、测试驱动开发...

    业余草
  • 自己动手制作“平均脸”【2】

    在本系列的上一篇中,我们讲解了用Image morphing方法合成人脸图片的基本原理。 所有代码都在:https://github.com/juliali/A...

    叶锦鲤
  • DX-watermark插件无法预览及上传图片报imagesx()错误的解决办法

    本文重新更新编辑于:2014 年 6 月 8 日 0 时 40 分. 这篇文章还是在 2014 年 2 月 12 日发布的,旧标题为:《不明问题让我折腾了一天!...

    张戈
  • Vmware添加磁盘的方法:扩展磁盘

    场景 创建Linux时分配磁盘空间随着使用的增加,使用率逐渐升高,此时需要在添加或者扩展一下磁盘。 比如:此Linux(CentOS 7.3)的磁盘为20...

    用户4478423
  • .NET 4.6.2正式发布带来众多特性

    虽然大多数人的注意力都集中在.NET Core上,但与原来的.NET Framework相关的工作还在继续。.NET Framework 4.6.2正式版已于近...

    张善友
  • 【学习笔记】解决layui的table分页没有checkbox记忆功能!!!

    layui是一款采用自身模块规范编写的前端 UI 框架,遵循原生 HTML/CSS/JS 的书写与组织形式,门槛极低,拿来即用。其外在极简,非常适合界面的快速开...

    用户5224393
  • Linux生产环境上,最常用的一套“vim“技巧

    研发线上使用最多的编辑器,就是vi。无论是最快查看某个文件内容,还是快速编辑某个文件,vi都能帮上忙。

    马哥linux运维
  • 简析 .NET Core 构成体系

    上图描述了 .NET Core的系统构成,最上层是应用层,是开发基于UI应用的框架集,包括了ASP.NET Core(用于创建web app),和 UWP(用于...

    莫问今朝

扫码关注云+社区

领取腾讯云代金券