MySQL中聚集索引、非聚集索引、联合索引、覆盖索引[通俗易懂]

MySQL中聚集索引、非聚集索引、联合索引、覆盖索引[通俗易懂]在《面试官:为啥加了索引查询会变快?》一文中,我们介绍了索引的数据结构,正是因为索引使用了B+树,才使得查询变快。说白了,索引的原理就是减少查询的次数、减少磁盘IO,达到快速查找所需数据的目的我们一起来看一下InnoDB存储引擎中的索引聚集索引聚集索引(clusteredindex)就是按照每张表的主键构造一棵B+树,同时叶子节点中存放的即为整张表的行记录数据,也将聚集索引的叶子节点称为数据页。聚集索引的这个特性决定了索引组织表中数据也是索引的一部分(备注:真实的B+树叶子节点是通过链表相连的,

大家好,又见面了,我是你们的朋友全栈君。

《面试官:为啥加了索引查询会变快?》一文中,我们介绍了索引的数据结构,正是因为索引使用了B+树,才使得查询变快。说白了,索引的原理就是减少查询的次数、减少磁盘IO,达到快速查找所需数据的目的

我们一起来看一下InnoDB存储引擎中的索引

聚集索引

聚集索引(clustered index)就是按照每张表的主键构造一棵B+树,同时叶子节点中存放的即为整张表的行记录数据,也将聚集索引的叶子节点称为数据页。聚集索引的这个特性决定了索引组织表中数据也是索引的一部分

在这里插入图片描述

(备注:真实的B+树叶子节点是通过链表相连的,这里只是为了说明聚集索引存储了行数据,凑合着看吧~)

每张表只能拥有一个聚集索引。在多数情况下,查询优化器倾向于采用聚集索引。因为聚集索引能够在B+树索引的叶子节点上直接找到数据。此外,由于定义了数据的逻辑顺序,聚集索引能够特别快地访问针对范围值的查询。查询优化器能够快速发现某一段范围的数据页需要扫描

辅助索引

辅助索引(Secondary Index,也称非聚集索引),叶子节点并不包含行记录的全部数据。叶子节点除了包含键值以外,每个叶子节点中的索引行中还包含了指向主键的指针。

辅助索引的存在并不影响数据在聚集索引中的组织,因此每张表上可以有多个辅助索引。当通过辅助索引来寻找数据时,InnoDB存储引擎会遍历辅助索引并通过叶级别的指针获得指向主键索引的主键,然后再通过聚集索引来找到一个完整的行记录

在这里插入图片描述

联合索引

联合索引是指对表上的多个列进行索引

从本质上来说,联合索引也是一棵B+树,不同的是联合索引的键值的数量不是1,而是大于等于2

联合索引有如下特点:

最左前缀原则

创建了(a,b,c)联合索引,如下几种情况都可以走索引:

  • select * from table where a = xxx;
  • select * from table where a = xxx and b = xxx;
  • select * from table where a = xxx and b = xxx and c = xxx

如下几种情况不走索引

  • select * from table where b = xxx;
  • select * from table where c = xxx;
  • select * from table where b = xxx and c = xxx;

本质上讲(a,b,c)联合索引等同于(a)单列索引、(a,b)联合索引、(a,b,c)联合索引三种索引的组合,符合最左前缀原则

覆盖索引

InnoDB存储引擎支持覆盖索引(covering index,或称索引覆盖),即从辅助索引中就可以得到查询的记录,而不需要查询聚集索引中的记录。使用覆盖索引的一个好处是辅助索引不包含整行记录的所有信息,故其大小要远小于聚集索引,因此可以减少大量的IO操作

  • 非聚集索引上直接可以拿到所需数据,不需要再回表查,比如 select id from table where name = xxx;(id为主键、name为索引列)
  • 在统计操作中也会使用覆盖索引。比如(a,b)联合索引,select * from table where b = xxx语句按最左前缀原则是不会走索引的,但如果是统计语句select count(*) from table where b = xxx;就会使用覆盖索引。

选择性

并不是在所有的查询条件中出现的列都需要添加索引。对于什么时候添加B+树索引,一般的经验是,在访问表中很少一部分时使用B+树索引才有意义。对于性别字段、地区字段、类型字段,它们可取值的范围很小,称为低选择性

按性别进行查询时,可取值的范围一般只有’M’、‘F’。因此上述SQL语句得到的结果可能是该表50%的数据(假设男女比例1∶1),这时添加B+树索引是完全没有必要的。相反,如果某个字段的取值范围很广,几乎没有重复,即属于高选择性,则此时使用B+树索引是最适合的

所以,我们在添加索引的时候,要尽量选择高选择性的字段,反之你在低选择性的字段上加了字段,查询可能也不会走索引

如果感觉对你有些帮忙,请收藏好,你的关注和点赞是对我最大的鼓励!
如果想跟我一起学习,坚信技术改变世界,请关注【Java天堂】公众号,我会定期分享自己的学习成果,第一时间推送给您

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/135995.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • burpsuite 越权_自动发现IDOR(越权)漏洞的方法:使用BurpSuite中的Autozie和Autorepeater插件来检测和识别IDOR漏洞,而无需手动更改每个请求的参数…

    burpsuite 越权_自动发现IDOR(越权)漏洞的方法:使用BurpSuite中的Autozie和Autorepeater插件来检测和识别IDOR漏洞,而无需手动更改每个请求的参数…IDOR(越权)漏洞:也称为“不安全的直接对象引用”,当用户请求访问内部资源或基于用户提供的输入对象进行访问,服务器未执行合理的权限验证时,发生当前用户可以未经授权访问不属于其帐户权限的资源或数据。我们可以在BurpSuite插件库Bapp中安装Autorize和Autorepeater:使用Autorize发现IDOR漏洞让我们先来看一下“Autorize”。对于客户端发送的任何请求,它将执行…

    2022年6月7日
    89
  • Ubuntu | ubuntu下安装edge

    Ubuntu | ubuntu下安装edge本文是关于如何在Ubuntu20.04下安装Edge浏览器的方法。安装目的目前在VMware虚拟机上安装了虚拟机Ubuntu,使用时默认是火狐浏览器,而在Windows下,更多的则是使用Edge或Chrome,因此有很多的收藏和记录在原本的Edge上。于是在Ubuntu上再次安装Edge,并使用同步功能将标签等信息同步过来,这样在两个平台上使用浏览器就更方便了。安装步骤首先打开edge的官网https://www.microsoft.com/zh-cn.

    2022年7月21日
    25
  • python可以自动回收垃圾吗_python多线程实现

    python可以自动回收垃圾吗_python多线程实现前言现在的高级语言如java,c#等,都采用了垃圾回收机制,而不再像c,c++里,需要用户自己管理内存。自己管理内存及其自由,可以任意申请内存,但这如同一把双刃剑,可能会造成内存泄漏,空指针等bug

    2022年7月30日
    19
  • VLAN标签「建议收藏」

    VLAN标签「建议收藏」1.VLAN标签定义和作用要使交换机能够分辨不同的VLAN报文,需要在报文中添加标识VAN信息的字段。IEEE802.1Q协议规定在以太网数据帧的目的MAC地址和源MAC地址字段之后、协议类型字段之前加入4个字节的VLAN标签(又称VLANTag,简称Tag),用以标识VLAN信息,IEEE802.1Q封装的VLAN数据帧格式如图所示。2.常用设备收发数据帧的VLAN标签情况…

    2022年8月10日
    6
  • 茂名重力石化装备股份公司_恒力石化二期项目批复

    茂名重力石化装备股份公司_恒力石化二期项目批复目前来看,广东省已经拥有诸多国外化工巨头、大型民营炼化企业和不少国企的炼化项目,成为很多石化企业首选的项目落地基地。“石化业高质量发展看广东”,已经逐渐明朗。今年3月31日,广东省发展改革委官网公布《广东省2021年重点建设项目计划》。在2021年重点项目名单中,广东共安排省重点项目1395个,总投资达7.28万亿元,年度计划投资8000亿元。其中新开工项目有3个,总投资约267亿元,年度投资约60.5亿元,分别是恒力石化(惠州)PTA项目、东华能源(茂名)烷烃资源综合利用项目.

    2022年10月10日
    2
  • pyinstaller 打包exe[通俗易懂]

    pyinstaller 打包exe[通俗易懂]环境:虚拟环境win10:21H2conda:4.11.0python:3.8.0所包含一些特殊的库:tensorflow-gpu:2.7pyqt5:5.15.6pyqt-tools:1.0.0pyinstaller:4.9pymysql:1.0.2pyyaml:6.0打包过程:1.在虚拟环境里安装pyinstallerpipinstallpyinstaller2.以管理员权限进入anacondaPromptcondaactiva

    2022年6月24日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号