影响MySQL索引B+树高度的是什么?

news2025/8/12 12:54:51

提到MySQL,想必大多后端同学都不会陌生,提到B+树,想必还是有很大部分都知道InnoDB引擎的索引实现,利用了B+树的数据结构。

那InnoDB 的一棵B+树可以存放多少行数据?它又有多高呢?

到底是哪些因素会对此造成影响呢,今天我们就来展开聊一下。

1、InnoDB引擎数据存储

在计算机中,磁盘存储数据最小单元是扇区,一个扇区的大小是512字节,而文件系统(例如XFS/EXT4)的最小单元是块,一个块的大小是4k,在InnoDB存储引擎中,也有页(Page)的概念,默认每个页的大小为16K,也就是每次读取数据时都是读取4*4k的大小!

​在MySQL中,InnoDB页的大小默认是16k,当然也可以通过参数设置:

2、InnoDB引擎数据操作

接下来,为了让大家能更好地理解数据存储逻辑,我们来进行一个数据操作实例进行讲解。

假设我们现在有一个用户表,我们往里面写入数据。

这里需要注意的一点是,在某个页内插入新数据行时,为了减少数据的移动,通常是插入到当前行的后面或者是已删除行留下来的空间,所以在某一个页内的数据并不是完全有序的。但是为了为了数据访问顺序性,在每个记录中都有一个指向下一条记录的指针,因此构成了一条单向有序链表。

当数据还比较少时,一个页就能容下,所以只有一个根结点,主键和数据也都是保存在根结点(左边的数字代表主键,右边姓名、性别代表具体的记录数据)。

假设我们写入10条数据之后,Page1满了,再写入新的数据会怎么存放呢?

有个叫“无名氏”的朋友来了,但是Page1已经放不下数据了,这时候就需要进行页分裂,产生一个新的Page页。

在InnoDB 中的页分裂流程是怎么样的呢?

1、产生新的Page2,然后将Page1的内容复制到Page2。 2、产生新的Page3,“无名氏”的数据放入Page3。 3、原来的Page1依然作为根结点,但是变成了一个不存放数据只存放索引的页,并且有两个子结点Page2、Page3。

看到这里,大家可能会有两个问题:

Q1:为什么要复制Page1为Page2呢?直接创建一个新的页作为根结点,这样不就少了一次复制的开销么?

A:如果是新创建根结点,那根结点存储的物理地址可能经常会变,不利于查找。并且在InnoDB中根结点是会预读到内存中的,所以结点的物理地址固定会比较好。

Q2:原来Page1有10条数据,在插入第11条数据的时候进行页裂变,根据对B-Tree、B+Tree特性的了解,那这至少是一颗11阶的树,裂变之后每个结点的元素至少为11/2=5个,那是不是应该页裂变之后主键1-5的数据还是在原来的页,主键6-11的数据会放到新的页,根结点存放主键6呢?

A:如果是这样的话,新的页空间利用率只有50%,并且会导致更为频繁的页分裂。所以InnoDB对这一点做了优化,新的数据放入新创建的页,不移动原有页面的任何记录。

随着数据的不断写入,这棵树也逐渐枝繁叶茂,如下图:

每次新增数据,都是将一个页写满,然后新创建一个页继续写,这里其实是有个隐含条件的,那就是主键自增!主键自增写入时新插入的数据不会影响到原有页,插入效率高!且页的利用率高!但是如果主键是无序的或者随机的,那每次的插入可能会导致原有页频繁的分裂,影响插入效率!降低页的利用率!这也是为什么在InnoDB中建议设置主键自增的原因!

这棵树的非叶子结点上存的都是主键,那如果一个表没有主键会怎么样?在InnoDB中,如果一个表没有主键,那默认会找建了唯一索引的列,如果也没有,则会生成一个隐形的字段作为主键!

有数据插入那就有删除,如果这个用户表频繁的插入和删除,那会导致数据页产生碎片,页的空间利用率低,还会导致树变得“虚高”,降低查询效率!这可以通过索引重建来消除碎片提高查询效率!

3、InnoDB引擎索引高度

回到开篇的问题:InnoDB 的一棵B+树可以存放多少行数据?它又有多高呢?

这个需要区分叶子节点和非叶子节点:

  • 非叶子节点

InnoDB 存储引擎默认一个数据页大小为16kb,非叶子节点存放(key,pointer),假设主键ID为bigint类型,长度为8字节,而指针大小在InnoDB源码中设置为6字节,这样一共14字节,即非叶子节点能存放 16kb/14 左右的key,pointer。

  • 叶子节点

单个叶子节点(页)中的记录数 = 16K/1K = 16。

这里我们假设一行记录的数据大小为1k左右

**总结一下: **

如果B+树高度为2的话,那么这棵B+树的存放总记录数为:根节点指针数*单个叶子节点记录行数 = 16kb/14 * 16 大约 1.8w+ 数据。

如果B+树高度为3的话,那么这棵B+树的存放总记录数为:根节点指针数*单个叶子节点记录行数 = 16kb/14 * 16kb/14 * 16 大约2kw+数据。

因此常见 InnoDB存储引擎B+树的高度基本为2-3。

·················· END ··················

希望今天的讲解对大家有所帮助,谢谢!

Thanks for reading!

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

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

相关文章

【软件测试】测试人的职责,我就是不当背锅侠......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 测试的目的&#xf…

基于机器视觉的移动消防机器人(四)--实验验证

本文素材来源于北方民族大学 机电工程学院 作者:牟义达、黄瑞翔、李涛 指导老师:田国禾、张春涛 1. 自主行走功能验证 实验目的:让机器人小车行驶500ms后停500ms,循环重复。 实验器材:计算机、消防机器人小车。 实…

ACM MM ECCV 2022 | 美团视觉8篇论文揭秘内容领域的智能科技

人工智能技术正在成为内容领域的中台力量,其中视觉AI已经渗透到内容生产、内容审核、内容分发、用户互动、商业化变现等各个环节。美团视觉智能部以场景化的内容产品、智能化的内容工具助力产业,在内容的创作、内容分发等环节应用广泛。 前不久&#xff…

开源项目让你也可以尝试玩转工业物联网以及智慧工厂(智能制造),IOT开源网关、SCADA取数开源、PLC数据采集

物联网进入与传统产业深度融合发展的崭新阶段。未来10年内,全球物联网将创造10多万亿美元的价值,约占全球经济的1/10,并与城市管理、生产制造、汽车驾驶、能源环保等形成数个千亿级规模以上的细分市场。 随着物联网技术的快速发展&#xff0c…

win10怎么录屏?windows自带录屏功能怎么用

​相信很多小伙伴家里的电脑都是win10系统的,想要录制电脑上的画面,那么就需要用到了windows自带的录屏功能。win10怎么录屏?windows自带的录屏功能怎么用?别担心,今天小编就来教教大家如何在win10系统上录制电脑屏幕。…

Python程序员:代码写的好,丝滑的壁纸少不了

人生苦短,我用Python序言python批量下载最后序言 不知道大家的电脑桌面一般用的什么类型的壁纸? 早上来上班,打开电脑,被漂亮的桌面壁纸所吸引,年底将近,这又是哪个地方的节日? 才晓得&#x…

[附源码]java毕业设计美妆销售系统

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

[附源码]java毕业设计农产品网络销售系统

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

论文阅读笔记 | 三维目标检测——F-PointNet算法

如有错误,恳请指出。 文章目录1. 背景2. 网络结构2.1 Frustum Proposal2.2 3D Instance Segmentation2.3 3D Box Estimation3. 实验结果paper:《Frustum PointNets for 3D Object Detection from RGB-D Data》1. 背景 基与鸟瞰图投影的方法(…

一个小台灯

22年11月填旧坑 项目地址:myhome: 服务器终端和微信小程序 (gitee.com) 物联网台灯小项目——ILamp 1、主要硬件,STM32,ESP8266; 2、3D打印的外壳,淘宝金属灯杆、灯罩、配重块; 3、喷涂了白色油漆外观…

pytorch深度学习实战lesson20

第二十课 卷积层的多输入和多输出通道 目录 理论部分 多输入通道 多输出通道 实践部分 理论部分 多输入通道 假设图片大小是200*200的话,那么用张量表示这个图片的话就是200*200*3,因为彩色图片是由红、绿、蓝三个通道构成的,因此表示一…

看完这套Java笔记,才明白笔者同时斩获7份大厂offer是有原因的!

不知道各位程序员朋友有没有做笔记的习惯?不过,我觉得大家还是蛮喜欢收藏笔记的,嘿嘿,我也是。 前几天恰好看到一篇文章,里面详细罗列了关于Java的所有知识点。看目录,是从Jvm开始,再讲集合、多…

PHP使用阿里云对象存储oss

目录 1.使用composer安装依赖 2.编写代码 3.调用 4.遇到问题 (1) 上传成功 访问发现没有权限 (2) 接着访问,发现直接下载 (3) 上传文件 发现文件内容是空 5.自定义域名上传文件 (1) 配置: (2) 代码修改 1.使用composer安装依赖 composer requ…

技术笔记Android应用MediaPipe(一):Windows安装MediaPipe

一、MediaPipe概述 MediaPipe提供跨平台,为实时流媒体提供自定义的机器学习解决方案的应用框架。MediaPipe的主要特点: (1)端对端的加速:内置快速机器学习推理和处理,使得在普通硬件中也能加速使用。 &…

电瓶车、汽车智慧充电站可提高运营利润,缩短投资回收周期!

安科瑞 李可欣 具体可咨询:Acrel_lkx 需求分析 传统充电站现状 充电站用户需求 建设智慧充电站,解决传统充电站痛点 安科瑞充电站解决方案 保障配电可靠,解决运维难的问题,降低人力成本 确保用电安全,及时切除隐患…

数云融合丨重构传统商贸数字化解决方案

随着5G技术的高速发展,我们迎来了数字化的新阶段,中国也正在加快步入新的消费时代。 数字化的发展带来的多元下消费力的提升,让传统商贸行业迎来数字化产业升级的十字路口,今天我们就来聊一聊数字化对传统商贸的重构。 传统商贸面…

LQ0204 振兴中华【递归】

题目来源:蓝桥杯2013初赛 C A组C题 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 小明参加了学校的趣味运动会,其中的一个项目是:跳格子。 地上画着一些格子,每个…

这些编程语言你需要了解一下

2022 年最受欢迎的语言 1、Python Python 位居 2022 年最受欢迎的语言榜首,并且鉴于多种原因成为最适合学习的编程语言之一。Python 是一种通用的服务器端编程语言,可用于从简单的脚本和自动化到复杂的 Web 应用程序和人工智能的许多方面。此外&#xf…

电科大离散数学-3-谓词逻辑-1

目录 3.1 谓词的引入 3.1.1 个体词 3.1.2 谓词 3.1.3 复合命题的谓词符号化 3.2 量词的引入 3.2.1 量词 3.2.2 谓词逻辑符号化的两条规则 3.2.3 量词相关的真值确定 3.2.4 谓词翻译和真值 3.2.5 个体域有限的情况 3.3 谓词符号化举例 3.3.1 谓词逻辑符号化示例一 …

gdb调试的插件安装——gef插件

以下博客中的链接都是大佬们提供的链接 gef插件源地址:https://github.com/hugsy/ 根据要求: gdb必须得8.0以上,python得3.6以上,但是一般裸机的gdb都是7.2,python是2.7。我们需要下载更高版本的gdb和python 先将系统…