揭秘InnoDB:为何MySQL选择B+树作为索引结构

news2024/11/13 18:02:20

我们知道MySQL数据库InnoDB引擎索引的数据结构是B+树,那他为什么不用红黑树,不用B树呢?用B+树的优点在哪里?解决了些什么问题?

下面将以这几个疑问点为中心记录一下MySQL选用B+树的原因。

揭秘InnoDB:为何MySQL选择B+树作为索引结构

案例数据:表a有如下两个字段,且两个字段数据如下

字段a(主键)1234567
字段b1293118366969

接下来将以常见的几种数据结构来看看进行比对,为什么MySQL最终使用了B+Tree(B+树)作为索引的数据结构。

索引的数据结构可以有如下几种:二叉树、平衡二叉树、红黑树、Hash表、B-Tree、B+Tree;

1. 二叉树(二叉查找树)

如果索引数据结构是二叉树(二叉查找树)(有序的):

字段b 的索引结构为

请添加图片描述

此时如果要查询数据 83 ,则查询路径为12–93–83,查询的很快,看起来很适合做索引的数据结构。

但是如果给 字段a 按照二叉树(二叉查找树)结构排好序,则为

请添加图片描述

此时如果要查询数据 7 ,则查询路径为1–2–3–4–5–6–7,将所有数据都遍历了一遍,相当于是一个链表了,查询效率就很低。

所以二叉树(二叉查找树)不适合查询有序数据,所以没有被应用于mysql的索引结构。

2. 平衡二叉树

请添加图片描述

平衡二叉树可以很好的解决二叉查找树遇到有序数据导致成为链表的情况。应为平衡二叉树有自平衡的特性,左右子树其中一边太长了之后,会触发平衡调整操作,进行旋转,保持树的左右子树平衡。

具体的概念和平衡二叉树的平衡调整操作过程可以看 《 平衡二叉树 》 。

那为什么mysql不使用平衡二叉树做索引结构呢?因为平衡二叉树太注重平衡性,需要经常进行平衡调整,操作过于频繁,会影响性能。

3. 红黑树

请添加图片描述

红黑树是一个弱平衡的二叉树,虽然也需要进行旋转操作,但是他不需要去保持整棵树的平衡,每次插入操作最多也只会旋转2次,极大程度减少了平衡调整操作的次数,从而操作性能红黑树比平衡二叉树要高。

而且红黑树和平衡二叉树的查询性能都为O(logn)。

但即使如此,他依旧不适合用当做mysql的索引结构,因为当数据量大了之后,红黑树树的高度是不可控的,树的高度越高,查询比较次数就越多,性能也就越低下。

4. B-Tree(B树)

红黑树的高度不可控,于是就出现了B树,B树的每一个节点是一个页,一页有16KB大小,每页里面都放满了索引元素,假如一条数据有5KB大小,那么就是一页里面可以放3个索引元素(B树的索引节点是同时存放整行业务数据的),那么他的示意图如下

请添加图片描述

所有索引元素不重复,且从左到右是递增排列的。

B树解决了红黑树高度不可控的因素,一个节点一页存储多个索引元素,很大程度上减少了树的高度。但是又因为每个索引元素都是会同时存储整行数据的,所以一页大小16KB,也存不了多少行。所以MySQL也没有使用B树,而是使用了B树的一个变种,B+树。

5. B+Tree(B+树)

请添加图片描述

B+树是B树的变种,非叶子节点,不会再存放索引对应的整行data数据,而是只存储冗余的索引字段,和数据页的地址。

且在B+树中,上层的非叶子节点的索引数据都是 冗余索引 ,就是最终获取数据是必须要一直查询到叶子节点,才可以获取到(非叶子节点不再存储整行数据)。

冗余索引:是从叶子节点里提取出来的索引,就叫冗余索引,提取出来的冗余索引和叶子节点一起组成构建了一个B+树。冗余索引都是每个叶子节点的第一个(一页数据的第一条索引)。

上图中的0003就是[0003, 0004]叶子节点(也可以理解为一页)里提取的第一个索引数据。0005就是[0005, 0006, 0007]叶子节点里提取的第一个索引数据。

而叶子节点是包含了所有的索引字段的,同时页子节点之间有指针连接,可以提高区间的访问性能。

例如:要查询0004,则先在第一层进行判断,0004>0003且0004<0005,所以就是在0003和0005之间,就拿到对应数据页的磁盘地址,然后就到[0003,0004]这一页的叶子节点里进行查找(用二分查找等算法)就能拿到0004的数据。

使用B+树作为MySQL的索引结构,只需要3层树的高度,就可以存储大概2千万~3千万的数据量。查询数据也只需要进行3次IO查询即可。

注意:只有主键索引的叶子节点才会存储整行数据,而非主键索引,其叶子节点存储的数据是主键Id,需要回表才能获取到整行数据。

关注我,我将持续输出Java常用相关技术文章。
请添加图片描述

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

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

相关文章

模型训练如何实现自动化输出评估报告、模型、特种平台

模型训练如何实现自动化 1、目标 把对文本分类【体育,教育,娱乐,经济,文学,政治】的模型实现自动化训练。 分类器:贝叶斯、支持向量机、梯度提升、随机森林、逻辑斯蒂回归 通过预设的准确率期望值与训练轮数,获取最优的分类器模型,当模型评估的准确率大于期望值时即…

Linux学习之路 -- 线程控制

前面我们介绍了线程的基础概念&#xff0c;即线程为进程内部的执行分支。下面我们将介绍一下具体的线程控制相关函数。 目录 1、铺垫 2、线程创建 3、线程等待 4、线程异常 5、线程退出 <1>线程函数返回退出 <2>pthread_exit <3>pthread_cancel 6、…

QT安装Qt Creater创建项目时无法选择Kit选项 No suitable kits found

1、安装QT时会遇到安装完qt&#xff0c;打开Qt Creater&#xff0c;新建工程时遇到无法选择Kit选项 No suitable kits found而无法下一步的问题。原因及解决方法如下&#xff1a; 2、原因&#xff1a; 因为在安装qt时&#xff0c;选择了错误的minGW&#xff0c;如下图&#xf…

【笔记】Java EE应用开发环境配置(JDK+Maven+Tomcat+MySQL+IDEA)

一、安装JDK17 1.下载JDK17 https://download.oracle.com/java/17/archive/jdk-17.0.7_windows-x64_bin.zip 2.配置环境变量 下载后&#xff0c;解压到本地&#xff08;目录中最好不要有中文或特殊字符&#xff09; 打开【控制面板】-【系统和安全】-【系统】-【高级系统…

Liunx:理解进程概念

一、进程概念 进程有两种可以理解的方式&#xff1a; 1、已经加载到内存中的程序&#xff0c;叫做进程。 2、正在运行的程序&#xff0c;叫做进程 从概念上挺好理解的&#xff0c;我们运行一个程序必然要通过CPU&#xff0c;所以自然需要加载到内存中…… 但我们应该关注的是&a…

Java反射:如何判断对象属性是否为static或final

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 在Java编程中&#xff0c;反射是一种强大的工具&#xff0c;允许在运行时检查类、接口、字段和方法的信息。通过反射&#xff0c;可以动态地创建对象、调用方法和访问字段&#xff0c;甚至可以修改私有字段的值。然而…

大模型:中国AI Agent应用研究报告2024

自2023年3月&#xff0c;以AutoGPT为代表的一系列技术框架的发布&#xff0c;Al Agent以其自主性和解决问题的能力&#xff0c;迅速获得科技圈各方讨论。并在之后一年多的时间中&#xff0c;陆续发布多项不同种类的技术框架。除了使用领域的探索之外&#xff0c;单智能体和多智…

2024华为OD统一考试题库清单(持续收录中)以及考点说明(Python/JS/C/C++篇)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;E卷D卷A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加…

大模型新书分享《大模型入门:技术原理与实战应用》(附PDF)

这本大模型书籍已经上传CSDN&#xff0c;朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】 新书速递 书名&#xff1a; 大模型入门&#xff1a;技术原理与实战应用 ISBN&#xff1a; 9787115638816 作者&#xff1a; 程絮森&#xff0c;杨波&am…

产品经理的发现和成长

获取更多资料&#xff0c;见下图

原装N9000B信号分析仪keysight/N9000B,N9000A详情参数

是德Keysight N9000B CXA 信号分析仪&#xff0c;多点触控&#xff0c; 特征&#xff1a; 9 kHz 至 26.5 GHz 的宽频率范围以及高达 25 MHz 的分析带宽让您了解更多 为手动和自动化制造测试系统添加可靠的信号分析 执行基本测量&#xff0c;例如杂散搜索和失真分析 使用可选…

1658.将x减到0的最小操作数

题目 链接&#xff1a;leetcode链接 思路分析&#xff08;滑动窗口&#xff09; 题目要求从最左边或者最右边移除元素&#xff0c;需要思考两侧&#xff0c;这是比较麻烦的。 正难则反&#xff0c;我们逆向思维一下&#xff0c;最后剩余的元素是不是中间的连续区间&#xf…

人工智能 | Hugging Face 的应用

大纲 Hugging-Face 介绍 Hugging-Face 大语言模型 LLM 管理Transformers 机器学习框架文本生成推理 (TGI) Hugging Face Hugging-Face – 大语言模型界的 Github Hugging Face 专门开发用于构建机器学习应用的工具。该公司的代表产品是其为自然语言处理应用构建的 transfo…

网络编程(学习)2024.9.5

目录 网络协议头分析 MTU MSS 粘包和拆包 粘包 粘包原因 解决粘包 拆包 包头分析 以太网头 IP头 ​编辑 Tcp头 三次握手和四次挥手 三次握手 四次挥手 TCP可靠性的保证 1. 数据包顺序 2. 数据完整性 3.. 确认应答&#xff08;ACK&#xff09; 4. 重传机制…

springboot个性化大学生线上聊天交友系统

基于springbootvue实现的个性化大学生线上聊天交友系统 &#xff08;源码L文ppt&#xff09;4-017 4系统设计 4.1 软件功能模块设计 个性化大学生线上聊天交友分为两个模块&#xff0c;分别是管理员功能模块和用户功能模块。主要功能模块包括&#xff…

探索数据可视化的奥秘:Seaborn库的魔力

文章目录 探索数据可视化的奥秘&#xff1a;Seaborn库的魔力背景&#xff1a;为何选择Seaborn&#xff1f;Seaborn是什么&#xff1f;如何安装Seaborn&#xff1f;简单函数介绍与示例场景应用示例常见问题与解决方案总结 探索数据可视化的奥秘&#xff1a;Seaborn库的魔力 背景…

ApiOps Helper:本地代码智能扫描,API的注册管理自动化

APIOps Helper是什么 APIOps Helper是在IntelliJ IDEA平台上开发的插件&#xff0c;可以自动识别IDEA中Java项目的代码&#xff0c;从中扫描出API并自动生成OpenAPI规范文档。 用户可以选择将API导出为本地OpenAPI规范文档&#xff0c;或者将API同步到APIOps平台上进行API协同…

挑选展厅设计伙伴?这些考量点助你决策

如今&#xff0c;随着数字化技术的快速发展&#xff0c;内容展览展示行业已经脱变为一个汇聚创新与创意的展示空间&#xff0c;并成为企业、文旅等各行业竞相追捧的平台&#xff0c;因此&#xff0c;挑选一家专业的多媒体展厅设计公司显得尤为重要&#xff0c;但是&#xff0c;…

maestro复制

problem&#xff1a;ADE Explore的maestro 里保存了设置的仿真器Analyses和扫描参数 Design Variables&#xff0c;如果要新建一个当前的testbench副本&#xff0c;除了复制schematic还希望能把maestro一起复制过去。但是直接复制maestro后仿真的时候还是对原有的schemetic在仿…

能否使用PLC无线通信模块实现力控与FX5U无线以太网通信?

在实际系统中&#xff0c;车间里分布多台PLC&#xff0c;需要用上位机软件集中控制。通常所有设备距离在几十米到上百米不等。用户会选择以太网方式是因为传输速度有保障&#xff0c;而选择无线以太网方案是因为不想开挖电缆沟&#xff0c;或者布线不方便&#xff0c;不但施工麻…