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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 申请软件著作权步骤[通俗易懂]

    申请软件著作权步骤[通俗易懂]前言:申请软件著作权对格式要求很严格,材料一定要保证格式正确,一般来说需要参考模板。另外,邮寄材料到版权中心的方式比较慢,而且万一材料格式或者内容不合适的话补正的话很麻烦,最好还是到现场办理成功率高。就我的经验来说,材料出现的错误率最高的是:1>要求签章的地方未按要求进行签章;2>材料提供的不全;3>材料内容不恰当,需要更改,比如浏览器需要加上安装卸载过程、微信小程序需要体现是在…

    2022年6月24日
  • 分布式服务框架 Zookeeper — 管理分布式环境中的数据

    分布式服务框架 Zookeeper — 管理分布式环境中的数据

    2021年8月29日
  • slic超像素分割算法_hdr算法

    slic超像素分割算法_hdr算法原文出自:https://blog.csdn.net/Fighting_Dreamer/article/details/77170859SLIC与目前最优超像素算法的比较RadhakrishnaAchanta,AppuShaji,KevinSmith,AurelienLucchi,PascalFua,andSabineS¨usstrunk摘要近年来,计算机视觉应用越来越依赖…

    2022年10月28日
  • 浏览器安装为知笔记插件(chrome浏览器)

    浏览器安装为知笔记插件(chrome浏览器)1.下载并安装驱动 wiz.cn/zh-cn/downloads-webclipper.html2.我选择的谷歌浏览器,因为不好翻墙,这里选择手动安装3.下载会得到一个crx文件。注意这里按照官方文档去添加到扩展程序会失败。我们要把这个文件后缀名改为.zip形式并解压,得到文件夹。注意:是直接将.crx改成.zip!!不是自己压缩成的4.接着,打开谷歌的“更多工具”…

    2022年8月18日
  • SpringBoot整合dubbo详述「建议收藏」

    环境:jdk1.8+springboot-2.2.1+dubbo-2.5.3+zookeeper-3.5.5+maven构建工具:IDEA我们知道,dubbo的本质就是一个远程服务调用的分布式框架。为了演示分布式架构的大致流程,我们项目里首先要建立对应的角色节点,即服务提供者、消费者以及公共接口服务,总体结构为:dubbo_demo:是总项目duboo-api:主要是…

    2022年4月16日
  • XMLElement,XMLDocument 用法「建议收藏」

    XMLElement,XMLDocument 用法「建议收藏」来源http://www.cr173.com/html/23515_1.html一前言先来了解下操作XML所涉及到的几个类及之间的关系 如果大家发现少写了一些常用的方法,麻烦在评论中指出,我一定会补上的!谢谢大家*1XMLElement主要是针对节点的一些属性进行操作*2XMLDocument主要是针对节点的CUID操作*3XMLNode为抽象

    2022年6月19日

发表回复

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

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