【MySQL】 B+ 树存储的原理

news2024/11/24 3:16:46

1. B 树 和 B+ 树

B Tree 模拟生成工具:https://www.cs.usfca.edu/~galles/visualization/BTree.html
B+Tree 模拟生成工具:
https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html

  • B 树 —— 1970年,R.Bayer和E.mccreight提出了一种适用于外查找的树,它是一种平衡的多叉树,称为B树(B-树、B_树)。其相对于普通的我们常见的树,具有如下特点:一个节点中可含有多个元素, 整个树有顺序,并且叶子节点都位于同一层。

在这里插入图片描述

  • B+ 树 —— 就是 B 树的一个升级版,其和B树一样是一种平衡的多叉树,并且一个节点可含有多个元素且整个树有序。但是相对于 B 树,B+ 树的叶子节点有指针,并且非叶子节点上的元素都冗余了一份在叶子节点上

在这里插入图片描述

2. MySQL 的 B+ 树结构

2.1 必要概念

MySQL InnoDB 存储引擎中的 Page 页概念: 其含义是当Innodb向磁盘中取数据时,以页为单位去存和读,页的默认大小为 16 KB (对应操作系统中局部性原理)。—— 对应在存储结构中 page 就是 B+ 树中的节点。一个 Page 的结构 ( B+ 树中的节点)结构如下图所示:

在这里插入图片描述

userRecord 用户记录的概念: page 页中含有 userRecord 用户记录,即当用户记录所占内存超过 16 KB 时,将其封装成页,放到磁盘中。

2.2 相关问题

在了解了 InnoDB 存储引擎中的页的概念后,让我们看一下相关的几个问题 ——

  • 当我们插入数据时,存储引擎会按照主键升序排序 ,为什么要在插入时排序,这不是会影响插入的性能嘛?

1) 通过对主键排序能提高查询的效率,能提前结束查找表中不存在数据的查找 —— 使用链表的方式(插入效率高,但是查询效率低)

2)在对主键进行排序后,我们可以通过建立页目录的方式提升查找链表的数据的效率(这里的页目录类比一本书中的目录的作用)—— 在具体实现上,我们将数据进行分组,对应每个组建立一个目录项,对应每个目录项用每组最小的主键值标记 —— 这也是典型的空间换时间的思想

扩展: 因为页目录的存在和插入时会按照主键进行排序的存在,在插入数据时建议使用自增 id 原因 —— 如果不用自增 id, 可能需要进行页内数据的交换,这样会极大的影响插入数据的效率
—— 这也引出了 使用 UUID 的问题,一是无序导致的插入效率慢 ;二是其生成的 ID 很长,要占更多的空间



  • 多页查找问题——在页数很多情况下,对每页的查找,不就又成了对链表的遍历嘛,那么MySQL 是如何设计提升多页查找的效率呢

在这里插入图片描述

以上图为例子,执行 select * from tableName where id = 6

若是不进行优化,查找过程为:遍历页链表取出每页,对每页进行查找,这样的方式就又是对链表的遍历了,而链表就是一种插入效率高,查找效率低的数据结构,我们需要对这种方式进行优化。
优化方式: 和为用户数据建立目录页一页,我们为页页目录再建立一个目录页 ,在这个目录页的目录页中存放的是原目录页中的id最小值。这样我们再进行查找时,就可以通过目录页的目录页,快速找到我们要查找的数据所在的页范围,我们再去指定的页范围内进行查找就行了。

那么,一个完整的 B+ Tree 存储示例如下图所示:

解释: 这是一个两层的 B+ Tree ,其共存放了 8 条用户数据,每个页含4条用户数据,共含三个页(两个用户数据页, 一个页目录目录页)

注: 当 B+ 树超过三层的话,就要考虑分库分表了,2 层的 B+ 树是比较好的



  • 2 层 B+ 树能存多少条数据,3 层 B+ 树能存多少条数据?

    2 层 B+ 树 ——
    假设我们的主键是 int 类型,占 4 个字节,而指针占 6 个字节,一个页可以放下 16 KB 的数据,那么存放页目录的目录的页中一共可以放下 (16KB / 10字节)个页目录,也就是说我们最多可以有 (16KB / 10字节)个数据页。那么假设我们的一条数据为 1 KB,总共可以有 —— (16KB / 10字节) * (16 KB / 1 KB)条数据 (页数 * 每个页可以存放的数据条数)
    3 层 B+ 树 ——
    3层的 B+Tree 就是为目录页的目录页再设置一个目录页,计算方法类似,这里不过多介绍



3. InnoDB 中的 B+ 树索引查找问题

3.1 索引查找问题

B+ 树是主键索引,叶子节点为数据库中的数据,上面的页为索引 —— 也可以叫聚集索引(聚簇索引, 即索引和数据在一起)

在查找时,使用在从上往下的找法,通过主键查找(= > < 都可以,支持范围查找) —— 为了更加好的支持范围查找,其在最底层叶子节点的数据处使用用双向指针
在这里插入图片描述

那要是不能走索引呢,即不通过主键找 的情况 —— 在这种情况,只能进行全表扫描,也就是从链表头扫描到链表尾

尾注:所有的不自信,所有的痛苦,所有的失望,都是因为技术不够强,我热爱我所学的,不后悔走上这条路,我也一定会坚持走下去,与君共勉

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

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

相关文章

[附源码]java毕业设计学生量化考核管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

LIN休眠唤醒及测试心得

上期LIN测试小课堂&#xff0c;我们分享了LIN总线帧结构及各场干扰&#xff0c;如何测试样件是否不响应错误的帧结构。 这次我们的介绍主题是LIN休眠唤醒&#xff0c;一起看看标准和差异性&#xff0c;开发和测试的关系&#xff0c;实际的案例分享也来了。 一、LIN控制器休眠…

编译原理—语义分析、语法制导翻译、翻译模式、中间代码生成

编译原理—语义分析、语法制导翻译、翻译模式、中间代码生成语法制导翻译语法制导定义(属性文法)翻译模式后缀式图示表示法构建表达式的语法树中间代码的种类三地址码四地址码对比举例中间代码产生的场景说明语句的翻译举例嵌套说明语句的翻译方案相关定义举例过程嵌套声明记录…

BDP FL-PEG5-炔丙基,2093197-93-2,BDP FL-PEG5-propargyl是一种 BDP FL 接头

BDP FL-PEG5-propargyl ​中英文名&#xff1a; CAS号&#xff1a;2093197-93-2| 英文名&#xff1a;BDP FL-PEG5-propargyl |中文名&#xff1a;BDP FL-五聚乙二醇-炔基&#xff0c; BDP FL-PEG5-炔丙基BDP FL-PEG5-propargyl ​物理参数&#xff1a; CASNumber&#xff1a;20…

微信小程序基础学习(5):使用 npm包、全局数据共享、分包

1. 使用 npm包 1.1 小程序对 npm 的支持与限制 目前&#xff0c;小程序中已经支持使用 npm 安装第三方包&#xff0c;从而来提高小程序的开发效率。但是&#xff0c;在小程序中使用 npm 包有如下 3 个限制&#xff1a; 不支持依赖于 Node.js 内置库的包。不支持依赖于浏览器…

查看进程信息(ps、top) + 操作后台进程(jobs、bg、fg)

目录 1、查看进程信息 (1) 查看进程快照 —— ps (2) 查看进程的动态信息 —— top (3) 查看进程的详细信息 —— /proc 2、操作后台进程 (1) 将进程转为后台 (2) 将后台进程转为前台运行 fg (3) 查看后台进程 jobs 1、查看进程信息 (1) 查看进程快照 —— ps 所谓…

Word控件Spire.Doc 【图像形状】教程(3) :在 C#/VB.NET 中的指定位置插入图像

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

【无标题】接口测试遇到的典型bug纪录

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

Java#22(内部类)

目录 一.内部类 1.什么是内部类? 2.什么时候用? 3.特点 二.成员内部类,静态内部类,局部内部类(稍微了解即可) 1.获取成员内部类对象的两种方式? 2.外部类成员变量和内部类成员变量重名时&#xff0c;在内部类如何访问? 2.静态内部类 3.局部内部类 三. 匿名内部类…

verdi基础操作

看波形&#xff1a; 1.代码里选中&#xff0c;再按鼠标中键拖进去 2.选中&#xff0c;ctrlw 3.用get signal 在波形框中&#xff0c;按照鼠标左键再左右移动&#xff0c;可以放大这一部分的波形&#xff0c;还有下面的功能键可以用 删除波形&#xff1a; 按delete或者cut掉…

如何压缩图片200k以下?

“图片过大无法上传”&#xff0c;“因您上传的图片大小超过限制”这样的提示大家都有遇到过吧&#xff1f;这就是告诉我们现在的图片需要压缩一下才能继续使用了&#xff0c;否则我们就无法使用当前照片了。 那有很多平台&#xff0c;特别是上传一些证件照的时候&#xff0c;要…

北京筑龙获爱分析采购数字化报告大满贯, 领跑供应链协同市场

2022年11月21日&#xff0c;国内领先的数字化市场研究咨询机构爱分析发布了《2022爱分析采购数字化厂商全景报告》&#xff08;以下简称《报告》&#xff09;。北京筑龙凭借专业的数字化技术、采购供应链数字化经验以及在政企数字化领域积累的丰富项目实践经验&#xff0c;成功…

微信小程序商城搭建步骤_我们来说说微信小程序商城开发的作用

比如下面我推荐的这个就有很多不错的各行业商城小程序模板&#xff0c;新手也能轻松搭建的那种&#xff01;&#xff08;见我主页&#xff09; 但要想把商城小程序运营到能稳定赚钱&#xff0c;就需要商家结合自身的实际&#xff0c;去指定合适的推广策略。下面就讲讲如何实现线…

第4章 配置集成第3方log4net日志中间件

在上一章中虽然已经把第3方log4net日志中间件定义到了当前程序中&#xff0c;但是并没有把第3方log4net日志中间件的功能配置并集到当前程序中&#xff0c;即当前程序还不能通过第3方log4net日志中间件把日志数据信息持久化到指定的文件或表中&#xff0c;本章即将实现当前程序…

SpringBoot2.X与redis Lettuce集成踩坑

起因 最近项目上发现一个问题&#xff0c;redis cluster集群有一台机崩了之后&#xff0c;后台服务的redis会一直报错&#xff0c;无法连接到redis集群。通过命令查看redis集群&#xff0c;发现redis cluster集群是正常的&#xff0c;备用的slave机器已经升级为master。 于是初…

c<7>存储

目录 1&#xff0c;局部变量 1,auto 2,static 2&#xff0c;全局变量的储存类型 3,register 4,extern 作用&#xff1a; 1&#xff0c;局部变量 #include <stdio.h> int main() {int fAuto(int a);int fStatic(int a); //函数声明int a 1, i; //自动局部变…

去了家新公司,技术总监不让用 IntelliJ IDEA想离职了

最近有个小伙伴微信和我说&#xff0c;新去的一家公司&#xff0c;技术团队全部规定要用的 Eclipse 开发&#xff0c;技术总监不让用 IntelliJ IDEA&#xff0c;付费也不行&#xff0c;说想离职了&#xff0c;问我该怎么办。 首先听到这件事情的时候&#xff0c;我表示十分理解…

关于消息队列的那些事

目录为什么需要消息队列1.异步处理2.服务解耦3.流量控制消息队列1.两种模型2.基本原理3.常见问题本篇文章参考文献如下&#xff1a; 面试题&#xff1a;如何保证消息不丢失&#xff1f;处理重复消息&#xff1f;消息有序性&#xff1f;消息堆积处理&#xff1f; (qq.com) 超详…

【数据通信】具有路由 WSN 模拟器的随机方式移动(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

Yolov5的类激活图

在本教程中&#xff0c;我们将了解如何将 EigenCAM&#xff08;无梯度方法之一&#xff09;用于 YOLO5。 这是https://github.com/jacobgil/pytorch-grad-cam/blob/master/tutorials/Class Activation Maps for Object Detection With Faster RCNN.ipynb 中 适用于 YOLO5的教程…