【MySQL索引:B+树与页的深度解析】

文章目录

  • MySQL索引:B+树与页的深度解析
    • 1. 索引使用的数据结构——B+树
      • 1.1 B+树介绍
      • 1.2 B+树的特点
      • 1.3 B+树和B树的对比
    • 2. MySQL中的页
      • 2.1 页的介绍
      • 2.2 页主体
      • 2.3 页目录
      • 2.4 B+树在MySQL索引中的应用

MySQL索引:B+树与页的深度解析

在MySQL数据库中,索引扮演着至关重要的角色,它作为一种数据结构,极大地助力了数据库在查询、存储及更新数据时的高效运作。鉴于在数据库操作里,查询的频率远远高于增删改的频率,索引的核心作用便在于提升数据检索的效率。

1. 索引使用的数据结构——B+树

1.1 B+树介绍

B+树是一种在数据库与文件系统等领域广泛应用的平衡查找树。以下是一个3阶B+树的示例图:

1.2 B+树的特点

结合上述图示,我们能够归纳出B+树具备以下特点:

  1. 数据有序性与操作复杂度:B+树能够维持数据的稳定有序,无论是插入还是修改操作,其时间复杂度均保持一致。
  2. 节点存储特性:非叶子节点仅承担索引功能,并不存储实际数据,而所有的叶子节点则负责保存真实的数据。
  3. 叶子节点链表结构:所有的叶子节点共同构成了一个有序链表,借助这一链表,可以依据排序次序依次遍历全部数据。

1.3 B+树和B树的对比

B树的结构如下图所示:

通过与B树对比,我们可以明晰B+树所具有的独特特点:

  1. 节点值包含关系:在B+树中,非叶子节点的值涵盖于叶子节点之中。
  2. 叶子节点数据连续性:B+树的叶子节点数据呈现连续且相互链接的状态,这一特性使得区间查找与搜索更为便捷。
  3. 性能均衡性:在树高相同的前提下,B+树查找任意元素的时间复杂度恒定,性能表现更为均衡。

2. MySQL中的页

2.1 页的介绍

  1. 数据存储位置:数据库中的数据存储于磁盘之上。
  2. 页内地址连续性:磁盘中每个页内部的地址是连续的。
  3. 页的作用与大小:页是内存与磁盘交互的最小单元,默认大小为16KB。即便某一页没有数据,也会占用16KB的存储空间,并且页与索引的B+树节点相对应。

在MySQL中存在多种类型的页,其中最常用的便是用于存储数据和索引的“数据页”或“索引页”。无论何种类型的页,都具备“页头”与“页尾”,页的主体信息则由“数据行”填充。

“数据页”的基本结构如下图所示:

由于页头包含上一页和下一页的页号,借助这两个属性,能够将页与页连接起来,形成一个双向链表。

2.2 页主体

每当创建一个新页时,系统会自动分配两行,一行代表页内最小行,另一行代表页内最大行。这两行并不存储实际信息,而是作为数据行链表的起始与结束标志。

当插入数据时,数据会被插入到最小行与最大行之间,并按照主键从小到大的顺序进行链接。

2.3 页目录

当一个页中存储的数据量过多时,查找数据会变得繁琐。为提升查找效率,InnoDB采用二分查找的方式来解决这一问题。

具体实现方式为创建一个页目录,将页内所有行进行分组,分组规则如下:

  • 头行(最小行)单独作为一组。
  • 其余行按照顺序分组,每组最多8条数据。

页目录中的一个槽对应一个分组,每组的最后一行地址会被记录在槽中。如此一来,在查找某行数据时,可先通过二分查找确定对应的槽,再在槽所对应的组中进行遍历,从而显著提高查询效率。

2.4 B+树在MySQL索引中的应用

在MySQL索引中,B+树的非叶子节点保存索引数据,叶子节点保存真实数据,如下表所示:

以下以查找“主键 = 3”为例,简要阐述其查找过程:

  1. 在索引页1中:由于3 < 7,所以进入索引页2。
  2. 在索引页2中:因为3 <= 3 < 5,进而进入数据页2。
  3. 在数据页中执行二分查找(依据分组的槽),确定对应的槽。
  4. 在对应的组中进行遍历,最终获取到数据。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

改进上一篇博文中的按键驱动读取程序,增加环形缓冲区

引言和具体的问题描述 上一篇博文&#xff1a;https://blog.csdn.net/wenhao_ir/article/details/145225508 中写的读取按键值的程序&#xff0c;如果按键按得很快&#xff0c;会出现前面的按键值被后面的按键值被覆盖的情况&#xff0c;即前面的按键值还没被来得及被读取&…

linux环境下软件安装

Linux环境下安装软件 linux安装tomcatLinux配置多台Tomcat linux 手动安装jdklinux yum安装jdk(openjdk)Nacos 安装下载nacos解压三、启动四、常用命令 git安装yum命令安装通过编译安装git linux安装tomcat 1.安装tomcat 下载tomcat安装包&#xff0c;解压到任意目录&#xff…

自定义提示确认弹窗-vue

最初可运行代码 弹窗组件代码&#xff1a; &#xff08;后来发现以下代码可运行&#xff0c;但打包 typescript 类型检查出错&#xff0c;可打包的代码在文末&#xff09; <template><div v-if"isVisible" class"dialog"><div class&quo…

leetcode707-设计链表

leetcode 707 思路 本题也是用了虚拟头节点来进行解答&#xff0c;这样的好处是&#xff0c;不管是头节点还是中间的节点都可以当成是中间节点来处理&#xff0c;用同一套方法就可以进行处理&#xff0c;而不用考虑太多的边界条件。 下面题目中最主要的实现就是添加操作addA…

LabVIEW桥接传感器配置与数据采集

该LabVIEW程序主要用于配置桥接传感器并进行数据采集&#xff0c;涉及电压激励、桥接电阻、采样设置及错误处理。第一个VI&#xff08;"Auto Cleanup"&#xff09;用于自动清理资源&#xff0c;建议保留以确保系统稳定运行。 以下是对图像中各个组件的详细解释&#…

OpenCV基础:获取子矩阵的几种方式

目录 相关阅读 方法一&#xff1a;使用切片操作 方法二&#xff1a;使用高级索引 方法三&#xff1a;使用条件筛选 方法四&#xff1a;使用 numpy 的 take 函数 相关阅读 OpenCV基础&#xff1a;矩阵的创建、检索与赋值-CSDN博客 OpenCV基础&#xff1a;图像运算-CSDN博客…

深入剖析Java线程安全的集合类:原理、特点与应用

引言&#xff1a;线程安全集合类的重要性 在当今的软件开发领域&#xff0c;多线程编程已经成为了构建高性能、响应式应用的关键技术。随着硬件技术的飞速发展&#xff0c;多核处理器的普及使得程序能够充分利用多个核心的计算能力&#xff0c;从而显著提升运行效率。在多线程环…

Ubuntu 22.04虚拟机安装配置调整(语言输入法字体共享剪切板等等

2025.01.07安装配置Ubuntu 22.04 记一下 快捷键 截屏 在设置-键盘-快捷键查看 跟搜到的不一样…不过shiftprint感觉也够用 安装 用的是VMware 参考&#xff1a;VMware中安装配置Ubuntu&#xff08;2024最新版 超详细&#xff09; 调教&#xff08;&#xff1f; 语言 改了…

vim练级攻略(精简版)

vim推荐配置: curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh 0. 规定 Ctrl-λ 等价于 <C-λ> :command 等价于 :command <回车> n 等价于 数字 blank字符 等价于 空格&#xff0c;tab&am…

VSCode 的部署

一、VSCode部署 (1)、简介 vsCode 全称 Visual Studio Code&#xff0c;是微软出的一款轻量级代码编辑器&#xff0c;免费、开源而且功能强大。它支持几乎所有主流的程序语言的语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码对比Diff、版本管理GIT等特性&…

Nginx在Linux中的最小化安装方式

1. 安装依赖 需要安装的东西&#xff1a; wget​&#xff0c;方便我们下载Nginx的包。如果是在Windows下载&#xff0c;然后使用SFTP上传到服务器中&#xff0c;那么可以不安装这个软件包。gcc g​&#xff0c;Nginx是使用C/C开发的服务器&#xff0c;等一下安装会用到其中的…

如何在vue中渲染markdown内容?

文章目录 引言什么是 markdown-it&#xff1f;安装 markdown-it基本用法样式失效&#xff1f;解决方法 高级配置语法高亮 效果展示 引言 在现代 Web 开发中&#xff0c;Markdown 作为一种轻量级的标记语言&#xff0c;广泛用于文档编写、内容管理以及富文本编辑器中。markdown…

Android 高版本如何获取App安装列表?

有个需求需要获取App内的安装列表,但是现在在高版本Android中,只能获取到一部分App效果,我获取的代码如下: val calendar Calendar.getInstance()val packageManager context.packageManagerval usageStatsManager context.getSystemService(Context.USAGE_STATS_SERVICE) …

第 5 场 算法季度赛

题目&#xff1a; 5.精准难度【算法赛】 - 蓝桥云课 问题描述 小蓝&#xff0c;蓝桥杯命题组的核心人物。今年的他出题灵感爆发&#xff0c;一口气出了 N 道题目&#xff0c;难度系数分别为 A1​,A2​,…,AN​。 只是&#xff0c;这些题目的难度参差不齐&#xff0c;让组委…

对话 TDengine 解决方案中心总经理陈肃:构建技术与市场的桥梁

TD 小T导读 他是大数据领域的杰出专家&#xff0c;拥有超过十项一作发明专利&#xff0c;是中国通信行业标准《大数据 消息中间件技术要求与测试方法》的重要编写者&#xff0c;并凭借数据中间件领域的突出成就荣获 2019 年“CJK OSS Award”。他是腾讯云 TVP 专家和 TGO 鲲鹏会…

rabbitmq安装延迟队列

在RabbitMQ中&#xff0c;延迟队列是一种特殊的队列类型。当消息被发送到此类队列后&#xff0c;不会立即投递给消费者&#xff0c;而是会等待预设的一段时间&#xff0c;待延迟期满后才进行投递。这种队列在多种场景下都极具价值&#xff0c;比如可用于处理需要在特定时间触发…

GitLab集成Jira

GitLab与Jira集成的两种方式 GitLab 提供了两种 Jira 集成&#xff0c;即Jira议题集成和Jira开发面板集成&#xff0c;可以配置一个或者两个都配置。 具体集成步骤可以参考官方文档Jira 议题集成&#xff08;极狐GitLab文档&#xff09;和Jira 开发面板集成&#xff08;极狐G…

【正则表达式】从0开始学习正则表达式

正则表达式&#xff08;英语&#xff1a;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE&#xff09; 一、推荐学习网站 正则表达式 – 语法 | 菜鸟教程 正则表达式30分钟入门教程 | 菜鸟教程 编程胶囊-打造学习编程的最好系统 二、必知必记 2.1 元字符…

【docker踩坑记录】

docker踩坑记录 踩坑记录(持续更新中.......)docker images 权限问题 踩坑记录(持续更新中…) docker images 权限问题 permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Head "http://%2Fvar%2Frun%2Fdocker.s…

HackMyVM-Klim靶机的测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、信息搜集 2、Getshell 3、提权 CVE-2008-0166 四、结论 一、测试环境 1、系统环境 渗透机&#xff1a;kali2021.1(192.168.159.127) 靶 机&#xff1a;debian(192.168.159.27) 注意事…