InnoDB存储引擎B+树的树高推导

news2024/10/6 19:02:19

目录

一、基本结论:InnoDB存储引擎B+树的树高3-4层

二、存储引擎B+树结构简单分析

三、主键索引B+树推导

四、InnoDB页的内部结构推导

五、剖析InnoDB数据文件推导

六、一般思路推导计算B+树高度总结

参考文献、书籍及链接


一、基本结论:InnoDB存储引擎B+树的树高3-4层

InnoDB存储引擎的B+树的树高通常是比较小的,通常在3-4层左右。这是因为InnoDB存储引擎采用了很多优化策略来减小B+树的高度。其中包括:

  1. 聚簇索引:InnoDB存储引擎的聚簇索引是按照主键进行组织的,这样可以避免在非聚簇索引中再次存储主键,从而减小了B+树的高度。
  2. 页分裂:当B+树中的某个页面已经满了时,InnoDB存储引擎会对该页面进行分裂,以保证B+树的平衡性。
  3. 页合并:当B+树中某些叶子节点的空间利用率较低时,InnoDB存储引擎会将这些节点合并成一个更大的节点,以减小B+树的高度。
  4. 自适应哈希索引:在InnoDB存储引擎中,如果某个表的某些查询经常使用某个非聚簇索引,那么InnoDB会自动为该索引创建哈希索引,从而提高查询效率。

这些优化策略的使用可以使得InnoDB存储引擎的B+树的高度通常比较小,从而提高数据库的查询效率。

二、存储引擎B+树结构简单分析

在InnoDB存储引擎中,使用B+树结构存放和组织索引和数据,一个典型的索引组织表结构如下:

这是一个包含(id,name)字段的数据在B+树上存放的方式。

在B+树中非叶子节点上存放主键ID以及指向下一层节点的指针,而在叶子节点上,则存放真正的数据。在叶子节点之间通过双链表的方式将相邻节点连接起来。

这里的“节点”就是InnoDB中的“页Page”。“页”是InnoDB存储数据的最小单元,默认大小为16K。对“页”理解,可以延伸到其他存储模型中,例如在文件系统和磁盘上都是自己的最小存储单元,文件系统中最小存储单元是4k,而在磁盘上最小存储单元是512字节。InnoDB从磁盘中加载数据就是通过以下的数据关系进行的。

从InnoDB的“页”的大小,可以推演出的结论是:一个表不管是否存放有数据,在InnoDB中至少占用16K空间;一个表不管有多大,InnoDB中使用的空间必然是16的整数倍

三、主键索引B+树推导

当树高=1时:这时B+树只有一个节点,即根节点,同时也是叶子节点,所有的数据就存放在这个节点中。假设单行数据大小为1k。则该节点可以存放的数据行数=节点容量/单行数据大小=16K/1K=16行数据

当树高=2时:这样B+树有根节点和叶子节点,根节点中存在主键和指针,叶子节点中存放数据。

每个叶子节点可以存放的数据行数,按上述推算=节点容量/单行数据大小=16K/1K=16行数据。而根节点中可以存放的指针数量=节点容量 / (主键长度+指针长度)=16K/(8byte+6byte)=1170。(注:指针长度固定为6字节,这里假设主键使用bigint类型,长度为8字节)

因此一个树高为2的B+树,可以存放的数据行数=单个叶子节点存放数据行数 X 根节点指针数量=16 X 1170 = 18720。

当树高=3时:这时B+树,包括一个根节点,一个非叶子节点和一个叶子节点。

按上述推算方式得出,树高=3时,可以存放的数量行数=单个叶子节点存放数据行数 X 非叶子节点指针数量 X 根节点指针数量 = 16 X 1170 X 1170 = 21902400。

因此推演得出结论:当单行数据大小为S字节,树高为H时,一个bigint类型的主键B+树索引中可以存放的数量行数N等于:

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

四、InnoDB页的内部结构推导

假设一个“页”的空间均用于存储用户数据,然而真实的“页”除了存储用户数据以外,还预留了空间存放一些辅助性的信息。一个完整的“页”由以下7个部分组成:

在“页”中占用空间最多是的User Records,即用于存放用户数据记录的空间。如果忽略Infimum + Supremum Records、Free Space、Page Directory使用的极少部分空间,则粗略认为用于存放数据记录的空间为:页容量 - Fil Header - Page Header - Fil Trailer = 16384 - 38 - 56 - 8 = 16282字节。按照该结果,更新公式:

通过推演计算B+树可以存放的数据行数,从侧面证明了普遍情况下B+树的树高为1-4层

五、剖析InnoDB数据文件推导

通过以上对InnoDB页的结构解析,知道在Page Header部分存在了一个Page Level的字段,该字段表示当前页在整个索引树中的位置。

  • 如果当前页位于树的叶子节点,则Page Level=0
  • 如果当前页位于叶子节点的上一层,则Page Level=1
  • 以此类推,假如一棵树有3层,那么:叶子节点Page Level=0,非叶节点Page Level=1,根节点Page Level=2
  • 如果通过Page Level反推树高的话,可以看出树高=根节点的Page Level+1

因此如果可以在InnoDB数据文件中找到主键索引中根节点的Page Level值,就可以推算出主键索引树的树高

找出主键索引在InnoDB数据文件中的页码

解析InnoDB数据文件中的主键索引根节点,需要先找到主键索引在数据文件中的位置。在MySQL内置的information_schema.INNODB_SYS_INDEXES、information_schema.INNODB_SYS_TABLES中包含主键索引所在的页码的信息。

SELECT
b.name as tableName, a.name as indexName, index_id, type, a.space, a.PAGE_NO
FROM
information_schema.INNODB_SYS_INDEXES a,
information_schema.INNODB_SYS_TABLES b
WHERE
a.table_id = b.table_id AND a.space <> 0 and b.name ='dbt3/lineitem' and a.name='PRIMARY';

通过该SQL查询到的lineitem表主键索引,页码为3。事实上在InnoDB中所有表的主键索引所在的页码都是3,这点可以通过查询其他表证实。

计算Page Level在数据文件中的位置

每页的大小(16K),可以在数据文件中定位主键索引所在页的位置。从而进一步找到Page Level字段在数据文件中的位置。

根据InnoDB页的结构特征,可以看到Fil Header部分占用了前38个字节,而Page Level字段在Page Header部分的26字节偏移量位置,并占用2个字节。因此可得出,Page Level字段在整个页中的位置是64字节偏移量的位置。

如果想解析数据文件(lineitem.idb文件)中的Page Level字段,需要跳过的偏移量=3 * 16384(16K) + 38+ 26 = 49152+64=49216 。Page Level的值,就在该偏移量的后续2个字节中。可以看出解析出lineitem.idb文件的Page Level=2,即树高=Page Level+1=3层

六、一般思路推导计算B+树高度总结

当我们在InnoDB存储引擎中使用B+树时,通常可以通过以下推导来计算B+树的高度:

  1. 首先,我们需要知道B+树的节点大小以及每个节点可以容纳的索引项数量,这可以通过InnoDB存储引擎的页面大小、节点头大小和索引项大小等参数来确定。
  2. 接着,我们可以根据B+树的定义来计算出根节点、中间节点和叶子节点的最小索引项数量。通常情况下,根节点和中间节点最少有两个子节点,而叶子节点的索引项数量通常是最多的。
  3. 然后,我们可以根据B+树的结构和定义来计算出根节点、中间节点和叶子节点的最大容纳索引项数量。对于中间节点和叶子节点,这个数量取决于节点大小和每个索引项的大小。
  4. 最后,我们可以使用B+树的定义和最小/最大索引项数量来计算出B+树的高度。在InnoDB存储引擎中,通常会尽量使B+树的高度趋近于最小值,以提高查询性能和减少磁盘IO开销。

需要注意的是,这只是计算B+树的高度的一种方法,不同的存储引擎和数据库可能会采用不同的优化策略,因此计算结果可能会有所不同。同时,B+树的高度也不是唯一影响查询性能的因素,还需要考虑索引选择性、数据分布情况等因素。

参考文献、书籍及链接

1.《MySQL技术内幕:InnoDB存储引擎》(第2版):MySQL技术内幕 (豆瓣)

2.《Inside InnoDB: The InnoDB Storage Engine》:MySQL :: MySQL 8.0 Reference Manual :: 15 The InnoDB Storage Engine

3.《InnoDB: The Ultimate Guide》:https://www.percona.com/blog/2018/06/05/innodb-the-ultimate-guide/

4.《InnoDB Storage Engine Internals》:https://mariadb.com/kb/en/innodb-storage-engine-internals/

5.InnoDB的数据页结构

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

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

相关文章

uni-app实战笔记

3 页面跳转 点击【成员列表】进入到子页面&#xff0c;这里就涉及到页面跳转。 路由是基础并不难&#xff0c;但是路由跳转的方式比较灵活&#xff0c;这里就需要记录一下。有一点是需要配置的&#xff0c;就是在pages.json中需要将路由整理好&#xff0c;否则页面是无法跳转的…

Hive架构原理以及部署教程

◆了解Hive架构原理 ◆了解Hive和RDBMS的对比 Hive架构原理 Hive架构原理 - 知乎 Hive 是基于 Hadoop 的数据仓库工具&#xff0c;它提供了类 SQL 查询语言 HQL&#xff08;Hive Query Language&#xff09;&#xff0c;可以将 SQL 语句转化为 MapReduce 任务进行数据处理。 Hi…

【软考备战·希赛网每日一练】2023年5月2日

文章目录 一、今日成绩二、错题总结第一题 三、知识查缺 题目及解析来源&#xff1a;2023年05月02日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析&#xff1a; 三、知识查缺 复习 流水线技术。序列图&#xff08;顺序图&#xff09;用于展现系统中一个用例和多…

剪枝与重参第九课:DBB重参

目录 DBB重参前言1. DBB2. DBB的六种变换2.1 Transform I: a conv for conv-BN2.2 Transform II&#xff1a;a conv for branch addition2.3 Transform III&#xff1a;a conv for sequential convolutions2.4 Transform IV&#xff1a;a conv for depth concatenation2.5 Tran…

【SpringBoot】 整合RabbitMQ 消息单独以及批量的TTL

生产者端 目录结构 导入依赖 修改yml 业务逻辑 队列消息过期 消息单独过期 TTL&#xff08;Time To Live&#xff09;存活时间。表示当消息由生产端存入MQ当中的存活时间&#xff0c;当时间到达的时候还未被消息就会被自动清除。RabbitMQ可以对消息单独设置过期时间也可以对…

爬虫 - QS世界大学排名数据

爬虫 - QS世界大学排名数据 网站简介爬虫方法概述使用工具爬虫概述 第一部分导入需要用到的python包设置selenium控制浏览器打开网页控制鼠标操作定位节点 提取数据滚轮翻页构建循环自动爬取数据数据储存 第二部分导入需要用到的python包获取网页设置请求头读取链接获取网页信息…

TIM-定时器——STM32

TIM-定时器——STM32 TIM(Timer)定时器 定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元&#xff0c;在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断功能&#xff0c;而且还包…

K8S第二讲 Kubernetes集群简易版搭建步骤

Kubernetes集群搭建步骤 1&#xff1a;准备物理或虚拟机器 为Kubernetes集群准备物理或虚拟机器。至少需要一个控制节点&#xff08;Master Node&#xff09;和一个工作节点&#xff08;Worker Node&#xff09;&#xff0c;建议使用Linux操作系统。 2&#xff1a; 安装Dock…

1987-2021年全国各省进出口总额数据含进口总额和出口总额

1987-2021年全国各省进出口总额数据含进口和出口 1、时间&#xff1a;1987-2021年 2、范围&#xff1a;包括全国30个省不含西藏 3、指标&#xff1a;进出口总额、进口总额、出口总额 4、单位&#xff1a;万美元 5、来源&#xff1a;各省NJ、JIN rong统计NJ 6、缺失情况说…

递归算法及经典例题详解

大部分人在学习编程时接触的第一个算法应该就是递归了&#xff0c;递归的思想其实很好理解&#xff0c;就是将一个问题拆分为若干个与本身相似的子问题&#xff0c;通过不断调用自身来求解。 但很多新手在实际操作中却很难正确使用到递归&#xff0c;有时面对问题还会有种无从…

win7下java环境搭建以及jdk环境变量配置

很多人在搭建页游、手游时候经常遇到JAVA闪退,基本都是环境变量或者路径错误导致的。本章节主要讲解在win7系统环境下,java环境变量配置方法,java环境配置正确,才可以对apk程序进行反编译运行页游手游。其他操作系统环境变量大同小异参考下就会了。 安装教程: 1、直接运…

让语言学习更简单的 WordFlow

作为一个英语并不是那么特别好的计算机专业学生&#xff0c;长期积累英语的学习对个人发展还是有意义的。简单来说&#xff0c;我在语言上最大的两个问题&#xff0c;一个自己「不理解」&#xff0c;另一个是自己「不会表达」。 上述两个问题主要体现在口语层面&#xff0c;而…

1997-2021年全国30省技术市场成交额(亿元)

1997-2021年全国30省技术市场成交额 1、时间&#xff1a;1997-2021年 2、范围&#xff1a;30省不含西藏 3、来源&#xff1a;国家统计J 4、指标&#xff1a;技术市场成交额 5、缺失情况说明&#xff1a;无缺失 6、指标解释及用途&#xff1a; 技术市场成交额是一个客观、…

YOLOv5 训练自己的数据集

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 ● 难度&#xff1a;夯实基础⭐⭐ ● 语言&#xff1a;Python3、Pytorch3 ● 时间&#xff1a;5月1日-5月6日 &#x1f37a;要求&#xff1…

基于C#开发 B/S架构的实验室管理系统 云LIS系统(MVC + SQLserver + Redis)

一、云LIS系统是将各种样本、免疫、临检、放免、及实验用的分析仪器&#xff0c;通过网络管理和传输实验分析过程中全部数据。对每一专业&#xff0c;实现检验申请、样本采集、样本核收、联机检验、质量控制、报告审核到报告发布的全环节的信息化管理平台。 二、基于B/S架构的云…

【SpringMVC】| SpringMVC注解式开发

目录 一&#xff1a;SpringMVC注解式开发 1. RequestMapping定义请求规则 2. 五种数据提交的方式 3. 请求参数中文乱码解决 4. action方法的返回值 5. SpringMVC的四种跳转方式 6. SpringMVC支持的默认参数类型 7. 日期处理 8. 标签的使用 9. 资源在WEB-INF目录下 一…

常见三种编码方式

常见三种编码方式 1. one-hot 编码2. 虚拟编码3. 效果编码 最近复习一些书&#xff0c;记录一下。在特征工程中&#xff0c;数据集经常会出现分类变量&#xff0c;这时候的分类变量可能是字符型&#xff0c;通常不能直接用于训练模型&#xff0c;这时需要对分类变量进行编码&am…

JavaWeb《CSS》

本笔记学习于Acwing平台 目录 1. 样式定义方式 2.1 行内样式表&#xff08;inline style sheet&#xff09; 2.2 内部样式表&#xff08;internal style sheet&#xff09; 2.3 外部样式表&#xff08;external style sheet&#xff09; 2. 选择器 2.1 标签选择器 2.2 …

ChatGPT服务器配置部署-chatGPT国内入口搭建

chatGPT国内入口 ChatGPT是由OpenAI公司开发的一种自然语言生成模型&#xff0c;国内入口一般是通过API接口或者SDK对接实现的。具体的对接方式可以参考以下步骤&#xff1a; 了解ChatGPT的API接口或者SDK: 首先需要了解ChatGPT提供的API接口或者SDK&#xff0c;包括使用方式、…

文件上传漏洞靶场

目录 第一关 源码 前端 后端 代码审计 前端 后端 绕过原理 抓包后未修改 抓包后修改且文件上传成功 第二关 源码 后端 代码审计 绕过原理 抓包后未修改 抓包后修改且文件上传成功 ​编辑 第三关 源码 后端 代码审计 绕过原理 第四关 源码 后端 代码审…