深入理解MySQL InnoDB中的B+索引机制

目录

一、InnoDB中的B+ 树索引介绍

二、聚簇索引

(一)使用记录主键值的大小进行排序

 页内记录排序

页之间的排序

目录项页的排序

(二)叶子节点存储完整的用户记录

 数据即索引

自动创建

(三)聚簇索引的优缺点

三、二级索引

(一)二级索引的特点

基于非主键列排序

叶子节点存储部分数据

(二)二级索引的工作流程

(三)二级索引的优缺点

四、联合索引

(一)联合索引的特点

多列排序规则

联合索引的组成

(二)联合索引与单列索引的区别

联合索引

单列索引

(三)联合索引的优缺点

(四)联合索引的使用建议

五、总结

 参考文献、书籍及链接


干货分享,感谢您的阅读!

在现代数据库系统中,索引是提高数据检索速度的关键机制之一。InnoDB作为MySQL的默认存储引擎,采用了高效的B+树结构来实现其索引功能。这种结构不仅确保了数据的快速检索,还支持高效的插入、更新和删除操作。理解InnoDB中的B+树索引对于数据库优化和性能调优至关重要。

为了更好地理解 InnoDB 中 B+ 树索引的工作机制,我们从创建一个示例表index_demo开始,并通过详细的示意图展示记录在页中的存储结构及索引的作用。

CREATE TABLE index_demo (
    c1 INT,
    c2 INT,
    c3 CHAR(1),
    PRIMARY KEY (c1)
) ROW_FORMAT = Compact;

这个表中有两个 INT 类型的列 c1c2,一个 CHAR(1) 类型的列 c3,并且 c1 列为主键。表的行格式为 Compact。其基础可见:

一、InnoDB中的B+ 树索引介绍

B+ 树索引是一种自平衡的树结构,其节点分为内部节点和叶子节点:

  • 内部节点(Internal Nodes):用于索引导航,存储键值和指向子节点的指针。
  • 叶子节点(Leaf Nodes):存储实际的数据记录或指向数据记录的指针(称为记录指针)。

在 B+ 树中,所有的数据记录都存储在叶子节点中,而内部节点仅用于存储键值和导航信息。

不论是存放用户记录的数据页,还是存放目录项记录的数据页,我们都把它们存放到B+树这个数据结构中,所以我们也称这些数据页为节点。

从图中可以看出来,我们的实际用户记录都存放在B+树的最底层的节点上,这些节点也被称为叶子节点或叶节点,其余用来存放目录项的节点称为非叶子节点或者内节点,其中B+树最上面的那个节点也称为根节点。

依据InnoDB存储引擎B+树的树高推导当树高为4时,可以存放200百多亿行数据。这样的数据容量,可以满足绝大部分应用的需求,因此我们可以说在绝大部分应用中,B+树高度为3或4就可以满足数据存储的需求。B+树这种高扇出低树高的特征,也大大的提高了主键查询性能。

二、聚簇索引

在InnoDB存储引擎中,聚簇索引(Clustered Index)是数据存储和索引的一种特殊而重要的结构。聚簇索引主要特点:

(一)使用记录主键值的大小进行排序

聚簇索引通过主键值对记录和页进行排序,这涉及三个方面:

 页内记录排序

在每个页内,记录按照主键值的大小顺序排成一个单向链表,确保了页内记录的有序性,方便快速查找。页内的记录被划分成若干个组,每个组中主键值最大的记录在页内的偏移量会被当作槽依次存放在页目录中(当然Supermum记录比任何用户记录都大),我们可以在页目录内通过二分法定位到主键列等于某个值的记录。

页之间的排序

存放用户记录的页按照页内记录的主键大小顺序排成一个双向链表。这种结构使得范围查询和顺序扫描更加高效。

目录项页的排序

存放目录项记录的页根据页内目录项记录的主键大小顺序排成一个双向链表。不同层次的页同样遵循这种排序规则,确保树的平衡性和查询效率。 

(二)叶子节点存储完整的用户记录

B+树的叶子节点存储的是完整的用户记录,即包括所有列的值(包括隐藏列),在InnoDB中,叶子节点不仅仅是索引,还包含了实际的数据记录。这种特性使得聚簇索引与普通索引有所不同。

数据即索引 

聚簇索引中的叶子节点存储了完整的用户记录,因此聚簇索引就是数据的存储方式。换句话说,索引即数据,数据即索引。

自动创建

在InnoDB存储引擎中,聚簇索引会自动为每个表创建,并且不需要在MySQL语句中显式使用INDEX语句去创建。通常情况下,聚簇索引是基于表的主键创建的。 

(三)聚簇索引的优缺点

聚簇索引的优点聚簇索引的缺点
快速数据访问:由于数据和索引存储在一起,基于主键的查询非常高效,不需要额外的索引查找。插入和删除成本较高:由于需要维护数据的有序性,插入和删除操作可能需要移动大量记录,导致性能开销。
有序数据存储:记录按照主键顺序存储,适合范围查询和顺序扫描,提高查询性能。更新成本较高:如果更新操作导致主键变化,会引发记录的重新定位和页的重新排序,影响性能。

聚簇索引是InnoDB存储引擎中一种关键的索引类型,通过主键排序和存储完整用户记录,提供了高效的数据访问和有序的数据存储。在优化数据库性能时,理解和合理使用聚簇索引可以显著提升查询和数据操作的效率。具体优化可见:MySQL索引性能优化分析。

三、二级索引

聚簇索引只能在搜索条件是主键值时才能发挥作用,因为B+树中的数据都是按照主键进行排序的。那如果我们想以别的列作为搜索条件该咋办呢?难道只能从头到尾沿着链表依次遍历记录么?不,我们可以多建几棵B+树,不同的B+树中的数据采用不同的排序规则。比方说我们用c2列的大小作为数据页、页中记录的排序规则,再建一棵B+树,效果如下图所示:

在InnoDB存储引擎中,除了聚簇索引(Clustered Index),我们还可以使用二级索引(Secondary Index)来提高非主键列上的查询性能。二级索引是一种基于非主键列的B+树结构,用于快速定位数据记录。

(一)二级索引的特点

基于非主键列排序

二级索引的B+树结构基于指定的非主键列进行排序,这包括以下几个方面:

  • 页内记录排序:在每个页内,记录按照指定列(例如c2列)的大小顺序排成一个单向链表。
  • 页之间的排序:存放用户记录的页按照页内记录的指定列顺序排成一个双向链表。这种结构便于快速范围查询和顺序扫描。
  • 目录项页的排序:存放目录项记录的页根据页内目录项记录的指定列顺序排成一个双向链表,不同层次的页同样遵循这种排序规则。

叶子节点存储部分数据

与聚簇索引不同,二级索引的叶子节点存储的是索引列和主键列的值,而不是完整的用户记录。这种设计减少了存储空间的占用,但在查询过程中需要进行回表操作以获取完整的用户记录。

(二)二级索引的工作流程

假设我们创建了一个基于c2列的二级索引,并通过c2列的值查找某些记录,以查找c2列的值为4的记录为例,查找过程如下::

  1. 确定目录项记录页

    从根页面开始,根据c2列的值4定位到目录项记录所在的页,通过页44快速定位到目录项记录所在的页为页42(因为2 < 4 < 9)。

  2. 通过目录项记录页确定用户记录真实所在的页

    在页42中,根据c2列的值确定实际存储用户记录的页。由于c2列没有唯一性约束,值为4的记录可能分布在多个数据页中。最终确定实际存储用户记录的页在页34和页35中(因为2 < 4 ≤ 4)。

  3. 在真实存储用户记录的页中定位到具体的记录

    在页34和页35中定位到具体的记录,但二级索引的叶子节点中仅存储c2列和主键列c1的值。

  4. 回表操作

    根据主键值到聚簇索引中查找完整的用户记录。这个过程称为回表操作,即从二级索引定位到主键,再通过主键在聚簇索引中查找完整记录。

(三)二级索引的优缺点

二级索引的优点二级索引的缺点
提高查询效率:基于非主键列的查询可以利用二级索引快速定位数据,减少全表扫描的开销。回表操作:查询完整记录时需要回表操作,增加了一次I/O开销。
灵活性:可以为多个列创建二级索引,提升多种查询条件下的性能。占用空间:虽然叶子节点不存储完整记录,但仍会占用额外的存储空间。

二级索引通过基于非主键列排序和存储索引列与主键列的值,为非主键列的查询提供了高效的解决方案。然而,由于叶子节点仅存储部分数据,查询完整记录时需要回表操作。因此,合理使用和配置二级索引,对于提升数据库查询性能至关重要。 具体优化可见:MySQL索引性能优化分析。

四、联合索引

在InnoDB存储引擎中,联合索引(Composite Index)是一种基于多个列的索引,用于提高复杂查询的效率。联合索引通过对多个列进行排序,能够更有效地处理包含多个条件的查询。

同时以多个列的大小作为排序规则,也就是同时为多个列建立索引,比方说我们想让B+树按照c2c3列的大小进行排序,这个包含两层含义:

  • 先把各个记录和页按照c2列进行排序。
  • 在记录的c2列相同的情况下,采用c3列进行排序

c2c3列建立的索引的示意图如下:

如图所示,我们需要注意一下几点:

  • 每条目录项记录都由c2c3页号这三个部分组成,各条记录先按照c2列的值进行排序,如果记录的c2列相同,则按照c3列的值进行排序。

  • B+树叶子节点处的用户记录由c2c3和主键c1列组成。

(一)联合索引的特点

多列排序规则

联合索引按照多个列的值进行排序,其排序规则包括以下两个层次:

  • 第一列排序:首先按照第一个指定列(例如c2列)的值进行排序。
  • 第二列排序:在第一列相同的情况下,按照第二个指定列(例如c3列)的值进行排序。

在这个结构中,每个目录项记录由c2、c3和页号组成,叶子节点存储c2、c3和主键c1。

联合索引的组成

  • 目录项记录:每条目录项记录由c2、c3和页号组成,先按照c2列排序,如果c2列相同,则按照c3列排序。
  • 叶子节点记录:叶子节点处的用户记录包含c2、c3和主键c1列。这种结构使得查询包含c2和c3列的条件时更加高效。

(二)联合索引与单列索引的区别

联合索引

  • 建立联合索引会生成一棵B+树,该树按照c2和c3列进行排序。
  • 查询时,如果使用c2和c3作为条件,能够快速定位记录,减少查询时间。

单列索引

  • 为c2和c3分别建立索引会生成两棵独立的B+树,每棵树分别按照c2或c3进行排序。
  • 查询时,如果只使用c2或c3作为条件,可以利用相应的索引。但如果同时使用c2和c3作为条件,可能需要进行多次索引查找和合并操作,增加查询开销。

(三)联合索引的优缺点

联合索引的优点联合索引的缺点
高效的多列查询:联合索引能够显著提高包含多个列条件的查询性能。插入和维护成本较高:由于需要对多个列进行排序和维护,插入和更新操作可能较慢。
减少单列索引的数量:通过一个联合索引代替多个单列索引,可以节省存储空间。部分匹配限制:联合索引在查询中只能高效利用前缀列,如果查询条件不包括索引的最左列,索引的利用率会降低。

(四)联合索引的使用建议

前缀匹配原则

联合索引在查询中按照列的顺序生效,因此查询条件应尽量包括索引的最左列(即前缀列)。例如,创建了(c2, c3)的联合索引后,查询条件包含c2或(c2, c3)时能够有效利用索引。

适用场景

联合索引适用于需要同时基于多个列进行查询的场景。例如,在电商系统中,可以为商品类别和价格区间创建联合索引,以优化相关查询。

联合索引是InnoDB中一种重要的索引类型,通过对多个列进行排序和索引,提高了多列查询的性能。与单列索引相比,联合索引在处理复杂查询时更加高效。然而,合理的索引设计和使用对于优化数据库性能至关重要。理解联合索引的工作原理和最佳实践,可以帮助我们更好地利用MySQL数据库。  具体优化可见:MySQL索引性能优化分析。

五、总结

InnoDB中的索引是提高数据检索效率的关键。本文介绍了三种主要索引类型:

  1. 聚簇索引:基于主键排序存储完整的用户记录,适合快速主键查询和范围查询。
  2. 二级索引:基于非主键列排序,提升非主键查询性能,但需要回表操作。
  3. 联合索引:基于多个列排序,适用于复杂查询,能够显著提升多列条件查询的效率。

通过合理使用和配置这些索引,能有效提升数据库查询和数据操作的性能。理解索引的工作机制和最佳实践,对于优化MySQL数据库性能至关重要。

 参考文献、书籍及链接

  • 《MySQL技术内幕:InnoDB存储引擎》(第2版):MySQL技术内幕 (豆瓣)
  • 《MySQL 是怎样运行的:从根儿上理解 MySQL》
  • 《Inside InnoDB: The InnoDB Storage Engine》:MySQL :: MySQL 8.0 Reference Manual :: 15 The InnoDB Storage Engine
  • 《InnoDB: The Ultimate Guide》:https://www.percona.com/blog/2018/06/05/innodb-the-ultimate-guide/
  • 《InnoDB Storage Engine Internals》:https://mariadb.com/kb/en/innodb-storage-engine-internals/
  • InnoDB的数据页结构
  • InnoDB存储引擎B+树的树高推导_b+树一般多少层-CSDN博客
  • MySQL索引性能优化分析_mysql索引和性能分析(实战)-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/888051.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[ 蓝桥 ·算法双周赛 ] 第 19 场 小白入门赛

&#x1f525;博客介绍&#xff1a; EvLast &#x1f3a5;系列专栏&#xff1a; <<数据结构与算法>> << 算法入门>> << C项目>> &#x1f3a5; 当前专栏: << 算法入门>> 专题 : 帮助小白快速入门算法竞赛 &#x1f44d…

机器学习西瓜书笔记(十四) 第十四章概率图模型

第十四章 概率图模型14.1 隐马尔可夫模型14.1.1 小结 14.2 马尔可夫随机场小结 14.3 条件随机场14.3.1 小结 14.4 学习与推断14.4.1 变量消去14.4.2 信念传播小结 14.5 近似推断14.5.1 MCMC采样14.5.2 变分推断小结 14.6 话题模型14.6.1 小结 总结 概率图模型 14.1 隐马尔可夫…

31 基于51单片机的水位监测系统仿真

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;DHT11温湿度检测&#xff0c;水位检测&#xff0c;通过LCD1602显示&#xff0c;超过阈值报警&#xff0c;继电器驱动电机转动。通过矩阵按键切换选择设置各项参数阈值。 …

LabVIEW程序怎么解决 Bug?

在LabVIEW开发过程中&#xff0c;发现和解决程序中的Bug是确保系统稳定运行的关键环节。由于LabVIEW采用图形化编程方式&#xff0c;Bug的排查和处理与传统编程语言略有不同。以下是解决LabVIEW程序中Bug的常见方法和技巧&#xff0c;涵盖从问题发现到解决的多个步骤和角度&…

vue3学习:axios输入城市名称查询该城市天气

说来惭愧&#xff0c;接触前端也有很长一段时间了&#xff0c;最近才学习axios与后端的交互。今天学习了一个查询城市天气的案例&#xff0c;只需输入城市名称&#xff0c;点击“查询”按钮便可以进行查询。运行效果如下&#xff1a; 案例只实现了基本的查询功能&#xff0c;没…

中断系统的原理

一、介绍 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的。中断是指‌CPU在正常运行程序时&#xff0c;由于内部或外部事件的发生&#xff0c;导致CPU中断当前运行的程序&#xff0c;转而去执行其他程序的过程。‌ 中断可以是硬件产生的&#xff0c;也可以是…

【重学 MySQL】四十八、DCL 中的 commit 和 rollback

【重学 MySQL】四十八、DCL 中的 commit 和 rollback commit的定义与作用rollback的定义与作用使用场景相关示例注意事项DDL 和 DML 的说明 在MySQL中&#xff0c;DCL&#xff08;Data Control Language&#xff0c;数据控制语言&#xff09;用于管理数据库用户和控制数据的访问…

集师专属知识付费小程序搭建 心理咨询小程序搭建

一、产品简介 集师SaaS知识付费软件&#xff0c;为知识创业者或商家提供一站式内容交付解决方案&#xff0c;助力商家搭建集品牌传播、商业变现和用户运营于一体的线上知识服务系统&#xff0c;覆盖全渠道经营场景&#xff0c;占据每个流量入口&#xff0c;使流量变现快速高效…

集智书童 | 用于时态动作检测的预测反馈 DETR !

本文来源公众号“集智书童”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;用于时态动作检测的预测反馈 DETR ! 视频中的时间动作检测&#xff08;TAD&#xff09;是现实世界中的一个基本且具有挑战性的任务。得益于 Transformer …

什么是 HTTP Get + Preflight 请求

当在 Chrome 开发者工具的 Network 面板中看到 GET Preflight 的 HTTP 请求方法时&#xff0c;意味着该请求涉及跨域资源共享 (CORS)&#xff0c;并且该请求被预检了。理解这种请求的背景&#xff0c;主要在于 CORS 的工作机制和现代浏览器对安全性的管理。 下面是在 Chrome …

Linux: network: 典型网络延迟图,CPU导致;

接上回说&#xff0c;https://mzhan017.blog.csdn.net/article/details/142689870&#xff1b; 其中在debug的过程中&#xff0c;看到下面这个IO图&#xff0c;这个图比较经典&#xff0c;是一个典型的网络延迟图&#xff0c;可用作为分析问题的一个参考。 如下图&#xff1a;黑…

2024年10月HarmonyOS应用开发者高级认证全新题库

注意事项&#xff1a;切记在考试之外的设备上打开题库进行搜索&#xff0c;防止切屏三次考试自动结束&#xff0c;题目是乱序&#xff0c;每次考试&#xff0c;选项的顺序都不同 新版题库&#xff1a;单选题40题 多选题20题 注意选项答案顺序不一样&#xff0c;大家记得看选项…

Redis篇(缓存机制 - 基本介绍)(持续更新迭代)

目录 一、缓存介绍 二、经典三缓存问题 1. 缓存穿透 1.1. 简介 1.2. 解决方案 1.3. 总结 2. 缓存雪崩 2.1. 简介 2.2. 解决方案 2.3. 总结 3. 缓存击穿 3.1. 简介 3.2. 解决方案 3.3. 总结 4. 经典三缓存问题出现的根本原因 三、常见双缓存方案 1. 缓存预热 1…

第Y2周:训练自己的数据集

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 在上一次体验yolov5s的为基础上&#xff0c;这次将训练自己的数据集。 在YOLO目标检测算法中常用的三种标签格式&#xff1a;voc(xml)、coco(json)和yolo(txt…

安防监控/视频系统EasyCVR视频汇聚平台如何过滤134段的告警通道?

视频汇聚/集中存储EasyCVR安防监控视频系统采用先进的网络传输技术&#xff0c;支持高清视频的接入和传输&#xff0c;能够满足大规模、高并发的远程监控需求。平台支持国标GB/T 28181协议、部标JT808、GA/T 1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为…

LabVIEW提高开发效率技巧----严格类型化定义

在LabVIEW开发过程中&#xff0c;严格类型化定义&#xff08;Strict Typedefs&#xff09; 是一种工具&#xff0c;用于保证程序中控件和常量的一致性&#xff0c;减少错误&#xff0c;提高维护效率。通过使用严格类型化定义&#xff0c;开发者可以确保在程序的多个地方引用相同…

个人项目简单https服务配置

1.SSL简介 SSL证书是一种数字证书&#xff0c;由受信任的证书颁发机构&#xff08;CA&#xff09;颁发&#xff0c;用于在互联网通信中建立加密链接。SSL代表“安全套接层”&#xff0c;是用于在互联网上创建加密链接的协议。SSL证书的主要目的是确保数据传输的安全性和隐私性…

Windows:win11旗舰版连接无线显示器,连接失败

摘要&#xff1a;win11系统通过 miracast 无线连接到长虹电视的时候&#xff0c;一直连接不上。查看电脑又是支持 miracast 协议&#xff0c;后续发现关闭防火墙即可正常连接。 一、问题现状 最近公司里新换了电视&#xff0c;打算把笔记本电脑投屏到电视上。由于 HDMI 插拔不…

python-pptx 中 placeholder 和 shape 有什么区别?

在 python-pptx 库中&#xff0c;placeholder 和 shape 是两个核心概念。虽然它们看起来相似&#xff0c;但在功能和作用上存在显著的区别。为了更好地理解这两个概念&#xff0c;我们可以通过它们的定义、使用场景以及实际代码示例来剖析其差异。 Python-pptx 的官网链接&…

深入理解Linux内核网络(二):内核与用户进程的协作

内核在协议栈接收处理完输入包以后&#xff0c;要能通知到用户进程&#xff0c;让用户进程能够收到并处理这些数据。进程和内核配合有很多种方案&#xff0c;第一种是同步阻塞的方案&#xff0c;第二种是多路复用方案。本文以epoll为例 部分内容来源于 《深入理解Linux网络》、…