InnoDB——详细说明索引中B+树的操作和原理

news2024/11/10 19:08:54

本内容针对Mysql5.x;

索引是应用程序设计和开发的一个重要方面。
若索引太多,应用程序的性能可能会收到影响。
而索引太少,对查询性能又会产生影响。

索引的注意事项:

  1. 如果知道数据的使用,从一开始就应该在需要处添加索引,而不是事后才想起添加。
  2. 添加索引需要通过监控大量的SQL语句进而从中找到问题。
  3. 当然索引也并不是越多越好,索引会占用相当大小的磁盘空间。

InnoDB存储索引概述

InnoDB存储引擎支持下面几种常见的索引:

  • B+树索引
  • 全文索引
  • 哈希索引

同时InnoDB存储引擎的哈希索引是自适应哈希:InnoDB存储引擎会根据表的使用情况自动为表生成哈希索引,无法人为进行干预。
B+树索引就是传统意义上的索引,这是目前关系型数据库系统中查找最为常用和最为有效的索引。

有一个需要注意的问题:B+树索引并不能找到一个给定键值的具体行

B+树索引能找到的只是被查询数据行所在的页。然后数据库通过把页读入内存,再在内存中进行查找,最后得到要查找的数据。

B+树


在介绍B+树索引之前,我们先介绍与之密切相关的一些算法与数据结构;

为什么不用平衡二叉树(AVL)

平衡二叉树的查找性能是比较高的,但不是最高的,最好的性能需要建立一颗最优二叉树。
但是最优二叉树的建立和维护需要大量的操作,因此,用户一般只需建立一颗平衡二叉树即可。

平衡二叉树的查询速度的确很快,但是维护一颗平衡二叉树的代价是非常大的。通常来说,需要1次或多次左旋和右旋来得到插入或更新后树的平衡性。
因此对一颗平衡树的维护是有一定开销的,不过平衡二叉树多用于内存结构对象中,因此维护的开销相对较小。

什么是B+树

B+树由B树和索引顺序访问方法(ISAM,这也是MyISAM引擎最初参考的数据结构)演化而来。
实际使用过程中几乎已经没有使用B树的情况了。

B+树的定义十分复杂,这里做一个简单的介绍:

B+树是为磁盘或其他直接存储辅助设备设计的一种平衡二叉树。在B+树中,所有记录点都是按键值的大小顺序放在同一层的叶子结点上,由各叶子节点指针进行连接。

叶子结点可以找到所有数据

下面看一个B+树,其高度为2,每页可存放4条记录,扇出(fan out,子树?)为5。
所有记录都在叶子节点上,并且是顺序存放的。

B+树的插入操作

B+树的插入必须保证插入后叶子节点中的记录依旧有序,同时需要考虑插入到B+树的三种情况,每种情况都可能会导致不同的插入算法。

Leaf Page满Index Page满操作
NoNo直接将记录插入到叶子节点
YesNo
  1. 拆分Leaf Page
  2. 将中间的节点放入到Index Page中
  3. 小于中间节点的记录放左边
  4. 大于或等于中间节点的记录放右边
    |
    | Yes | Yes |
  5. 拆分Leaf Page
  6. 小于中间节点的记录放在左边
  7. 大于或等于中间节点的放右边
  8. 拆分Index Page
  9. 小雨中介节点的放在左边
  10. 大于中间节点的放在右边
  11. 中间节点放入上一层Index Page
    |

初始状态

Leaf Page满,Index Page未满

Leaf Page满,Index Page满

最后插入95,需要做两次拆分

可以看出,不管怎么变化,B+树总是会保持平衡。但是为了保持平衡对于新插入的键值可能需要做大量的拆分页(split)操作。
因为B+树结构主要用于磁盘,页的拆分意味着磁盘的操作,所以应该在可能的情况下尽量减少页的拆分操作。

页插入优化(树旋转操作)

由于拆页非常影响性能,B+同样提供了类似平衡二叉树的旋转(Rotatioin)功能。
旋转发生在Leaf Page已经满,但是其的左右兄弟节点没有满的情况下。
这时B+树并不会急于去做拆分页的操作,而是将记录移到所在页的兄弟节点上。通常情况下,左兄弟会先被检查用来做旋转操作。
我们再用上面初始状态的树来讨论,若插入键值70,其实B+树并不会急于去拆分叶子节点,而是去做旋转:

这样的话,采用旋转操作使B+树减少了一次页的拆分操作,同时高度还是2。

B+树的删除操作

B+树使用填充因子(fill factor)来控制树的删除变化,50%是填充因子可设的最小值

B+树的删除操作同样必须保证删除后叶子节点中的记录依然有序,同插入一样,B+树的删除操作同样需要考虑下吗三种情况,与插入不同的是,删除根据填充因子的变化来衡量。

叶子节点小于填充因子中间节点(Index Page)小于填充因子操作
NoNo直接将记录从叶子节点删除,如果该节点还是Index Page的节点,用该节点的右节点代替
YesNo合并叶子节点和它的兄弟节点,同时更新Index Page
YesYes
  1. 合并叶子节点和它的兄弟节点
  2. 更新Index Page
  3. 合并Index Page和它的兄弟节点
    |

此处图片略去…

B+树索引

前面讨论的都是B+树的数据结构及其一般操作。

B+树索引的本质就是B+树在数据库中的实现

但是,B+索引在数据库中有一个特点是**高扇出性,**因此在数据库中B+树的高度一般在2~4层。
也就是说查找某一键值的行记录时最多只需要2~4次I/O

数据库中的B+树索引可以分为聚集索引(clustered index)和辅助索引(secondary index)
但是不管是聚集索引还是辅助索引,内部都是B+树,即高度平衡的,叶子节点存放着所有的数据
聚集索引与辅助索引不同的是,叶子节点存放的是否是一整行的信息。

聚集索引

聚集索引是按照每张表的主键构造一颗B+树,同时叶子节点中存放的即为整张表的行记录数据,
也将聚集索引的叶子节点称为数据页

聚集索引的这个特效决定了索引组织表中数据也是索引的一部分。
同B+树数据结构一样,每个数据页都通过一个双向链表来进行连接。
由于实际的数据页只能按照一颗B+树进行排序,因此每张表只能拥有一个聚集索引
因此,大多数情况下,查询优化器倾向于采用聚集索引。因为聚集索引能够在B+树索引的叶子节点上直接找到数据。
同时,由于定义了数据的逻辑顺序,聚集索引能够特别快地访问针对范围值的查询**。**查询优化器能够快速发现某一段范围的数据页需要扫描

聚集索引的结构

聚集索引中包含数据页(叶子节点)与非数据页(非叶子节点)同时数据页上存放的是完整的每行的记录
而在非数据页的索引页中,存放的仅仅是键值及指向数据页的偏移量,而不是一个完整的行记录。
因此这颗聚集索引树的构造大致如下图所示:

聚集索引的存储并不是物理上连续的,而是逻辑上连续的,否则维护成本会非常高。
有两个特点

  1. 数据页会通过双向链表连接,页按照主键的顺序排序
  2. 每个页中的记录也是通过双向链表进行维护的,物理存储上可以同样不按照主键存储。

同时,对于主键的排序查找和范围查找,聚集索引的速度都非常的快

辅助索引

辅助索引(Secondary Index,也称为非聚集索引,叶子节点并不包含行记录的全部数据。

叶子节点中存储索引键值,除此之外,每个叶子节点中的索引行还包含了一个书签(bookmark)
该书签用来告诉InnoDB存储引擎哪里可以找到与索引相对应的行数据。

由于InnoDB存储引擎是索引组织表,因此InnoDB存储引擎的辅助索引的书签就是相应行数据的聚集索引键。

辅助索引并不影响数据在聚集索引中的组织,因此每张表上可以有多个辅助索引。

如何定位数据

  1. InnoDB存储引擎会遍历辅助索引并通过叶级别的指针获得指向主键索引的主键
  2. 通过主键索引来找到一个完整的行记录

那么如果对于一颗高度为3的辅助索引,同时聚集索引树的高度同样为3,那么一共需要6次逻辑IO访问才能得到最终的一个数据页。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

车企数据分类分级的实践指南出炉!“数据安全推进计划”发布,奇点云参编

日前,“数据安全推进计划”(DSI)正式发布《智能网联汽车数据分类分级实践指南》(下文简称“指南”),旨在以合规为主要导向,明确智能网联汽车数据分类分级的方法论,为数据全生命周期的…

每日学术速递3.7

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Dropout Reduces Underfitting 标题:Dropout 减少欠拟合 作者:Zhuang Liu, Zhiqiu Xu, Joseph Jin, Zhiqiang Shen, Trevor Darrel 文章链接:h…

SpringBoot(Tedu)—DAY01——环境搭建

SpringBoot(Tedu)—DAY01——环境搭建 目录SpringBoot(Tedu)—DAY01——环境搭建零、今日目标一、IDEA2021项目环境搭建1.1 通过 ctrl鼠标滚轮 实现字体大小缩放1.2 自动提示设置 去除大小写匹配1.3 设置参数方法自动提示1.4 设定字符集 要求都使用UTF-8编码1.5 设置自动编译二…

controller-runtime搭建operator开发环境

目录 基本结构 注入CRD 基本结构 首先下载相应的go pkg go get -u sigs.k8s.io/controller-runtime 接下来需要创建控制器和Manager Operator的本质是一个可重入的队列编程模式,而Manager可以用来管理Controller、Admission Webhook,包括访问资源对…

MATLAB算法实战应用案例精讲-【优化算法】樽海鞘群算法(SSA)及其算法变种(附matlab代码实现)

目录 前言 算法原理 算法思想 数学模型 (1)种群初始化 (2)领导者位置更新 (3)跟随者位置更新 代码实现 算法流程图 算法步骤 伪代码 SSA伪代码 MSSA伪代码 面向全局搜索的自适应领导者樽海鞘群算…

同模块设置不同应用主题方案

有时候公司内部会有不同应用但是有部分模块功能一样,只根据应用角色有些细节逻辑区分的场景。这时候往往采用模块化采用以应用至不同的APP。如果APP主题不一致,该如果解决。 方案: 在不同应用的config.gradle 下面根据不同应用定义不同的a…

基于SSM+SpringBoot《CRM客户关系管理系统》实战开发教程(附文档及源码)

1.项目简介 客户关系管理(Customer Relationship Management,简称CRM),是指企业为提高核心竞争力,利用相应的信息技术以及互联网技术协调企业与顾客间在销售、营销和服务上的交互,从而提升其管理方式&…

AUTOSAR知识点Com(一):CANIf入门知识

目录 1、概述 2、上下层关系 2.1 上层 2.2 下层 3、链接 4、记录项 1、概述 下面主要是规范方面的描述: 参考文档《AUTOSAR_SWS_CANInterface.pdf》 CAN接口模块(下文简“CanIf”)位于底层CAN驱动(CanDrv)、CA…

华为机试题:HJ103 Redraiment的走法(python)

文章目录(1)题目描述(2)Python3实现(3)知识点详解1、input():获取控制台(任意形式)的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…

【Python笔记20230307】

基础 编码、解码 str.encode(utf-8) # 编码 str.decode(utf-8) # 解码关键字 import keyword keyword.kwlist格式化输出 % 占位符:%s 字符串%d 整数%f 浮点数Hello, %s % world Hi, %s, you have $%d. % (Michael, 1000000) 占位符的修饰符 -左对齐 .小数点后位数 0左边补零…

SpringCloud简介

一、注册中心 1、为什么需要用到注册中心? 让消费者服务及时知道提供者服务的状态。例如:是否宕机、是否增加了集群实例等。 2、dubbo和zookeeper 特点:服务消费端订阅注册中心。服务提供端增加实例会把新实例注册到注册中心,…

HCIP知识点(前三天)

复习HCIA: 一、TCP/IP模型,OSI模型 OSI 开放式系统互联参考模型 应用层 抽象语言—>编码 表示层 编码—>二进制 会话层 应用程序内部的区分地址(无标准格式) 传输层 TCP/UDP – 分段(受MTU限制)、端…

C 语言网络编程 — PF_NETLINK sockets

目录 文章目录目录PF_NETLINK socketsPF_NETLINK sockets Linux 提供了 4 种 User Process 和 Kernel 之间进行通信的 IPC(Inter-Process Communicate,进程间通信)方式: /procioctlsysfsPF_NETLINK sockets(Netlink …

vue大型商城系统中遇到的问题(上)

一:创建仓库1.领导创建git仓库(参考————这篇文章),新手下载git2.打开cmd终端,将git仓库拉到本地3.进入文件目录,查看分支(新手向——为什么需要创建分支,查看---)4.创…

HCIP笔记

第一天 ARP协议 正向ARP:通过IP地址获取目的MAC地址 过程: 目的IP到目的MAC再到ARP表中,所需时间是180s 反向ARP:通过目标MAC地址获取目标IP地址 免费ARP:利用正向ARP的原理请求自己的IP地址 1.自我检测 2.检测地址冲…

使用JMeter 录制脚本

使用JMeter 录制脚本,参考的一个博主的,我记录到我这里,留着以后用哈哈哈哈 1,添加 HTTP代理服务器 测试计划右键–》添加–》非测试元件–》http代理服务器 2,添加线程组,用来存放录制脚本的&#xff0c…

C语言设计模式:实现简单工厂模式和工程创建

目录 一,设计模式概念引入 ① 什么是设计模式 ② 什么是类和对象 ③ 什么是工厂模式 二,C语言工厂模式的实现 ① 普通类和对象的代码实现 ② 工厂模式代码实现 ● cat.c ● dog.c ● person.c ● animal.h ● mainpro.c ● 完善mainpro.c …

硕士毕业论文常见的排版小技巧

word排版陆续更新吧,更具我所遇到的一些小问题,总结上来 文章目录1.避免题注(图或者表的标题)与图或表格分不用页注意点:光标移动到表的题注后面2.设置论文的页眉关键点:需要将每一章节末尾,都要…

Hadoop 运行环境搭建(开发重点)

文章目录Hadoop 运行环境搭建(开发重点)一、安装JDK二、安装配置 Hadoop1、安装 hadoop2、hadoop 目录结构3、设置免密登录4、完全分布式模式(开发重点)1)分发jdk2)集群配置(1) 集群部署规划(2) 配置文件说…

2.3 二分搜索技术

二分搜索算法是运用分治策略的典型例子。给定己排好府的 n个元素a10:n-1],现要在这n个元素中找出一特定元素3。首先较容易想到的是用顺序搜索方法,逐个比较a10:1-1]中元素,直至找出元素,或搜索遍整个数组后确定,不在其…