【Mysql】InnoDB 中 B+ 树索引的注意事项

news2025/2/23 12:59:55

一、根页面万年不动

在之前的文章里,为了方便理解,都是先画存储用户记录的叶子节点,然后再画出存储目录项记录的内节点。

但实际上 B+ 树的行成过程是这样的:

  • 每当为某个表创建一个 B+ 树索引,都会为这个索引创建一个根节点页面。最开始表里没数据,所以根节点中既没有用户记录,也没有目录项记录。

  • 当往表里插入用户记录时,先把用户记录存储到这个根节点上。

  • 当根节点页空间用完,继续插入记录,此时会将根节点中所有记录复制到一个新页(比如页 a),然后对这个新页进行页分裂,得到另一个新页(页 b)。这时候新插入的记录就根据键值大小分配到页 a 和 页 b 中。于是,根节点页就升级成了存储目录项记录的页,就需要把页a 和 页b 对应的目录项记录插入到根节点中。

另外,当一个B+树索引的根节点创建后,它的页号就不会再变

所以只要我们对某个表建立一个索引,那么它的根节点的页号就会被记录到某个地方,后续只要 innodb引擎需要用这个索引,就会从那个固定的地方取出根节点的页号,从而访问这个索引。

二、内节点中目录项记录的唯一性

在B+树索引的内节点中,目录项记录的内容是索引列+页号。但是对于二级索引来说,不太严谨。

因为二级索引的索引列可能存在相同的值,比如某张表里有这4条记录,其中c1列是主键 :

现在为c2列建立索引:

如果这时候继续插入一条记录,3个列分别为9、1、'c',就会遇到问题:

  • 新记录中 c2的值也是1,那么这个新记录到底应该放在页 4,还是放到页 5?

所以,为了能让新插入的记录可以找到自己应该到哪个页中,就需要保证B+树同一层内节点的目录项记录是唯一的

那么,实际上二级索引的内节点的目录项记录应该由 3 个部分组成:

  • 索引列的值
  • 主键值
  • 页号

所以实际上给c2建立的索引应该是这样:

现在,当插入新记录9、1、'c'时:

  • 可以先把新记录的 c2 列的值和页 3 中各目录项记录的 c2 列的值进行比较。
  • 如果 c2 列的值相同,就接着比较主键值。

所以,对于二级索引来说,给 c2 列建索引,其实就相当于用c2、c1建立了一个联合索引。先按照二级索引的值进行排序,在二级索引列值相同的情况下,再按照主键值进行排序。

三、一个页面至少容纳 2 条记录

在之前的文章里提到过,B+ 树其实只需要很少的层级就可以轻松存储数亿条记录,查询速度还很快。

这是因为 B+ 树本质上就是一个大的多层级目录。每经过一个目录时都会过滤许多无效的子目录,直到最后访问到存储真正数据的目录。

那么现在不妨设想一下:还是同样的数据量,如果一个大的目录只存放一个子目录,又是什么样子?

  • 目录层级非常多
  • 最后那个存放真正数据的目录中只能存放一条记录

如果是这样的话,这种B+ 树结构就没什么意义了,不能形成一个有效的索引。于是,设计 innoDB的大佬为了避免 B+树的层级增长得过高,要求所有数据页都至少可以存放2条记录

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

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

相关文章

Vue.js 中的服务端渲染和客户端渲染的区别

Vue.js 中的服务端渲染和客户端渲染的区别 Vue.js 是一个流行的前端框架,它提供了一种简单而强大的方式来构建交互式用户界面。Vue.js 可以在客户端和服务端执行渲染,这两种方式有不同的优势和劣势。本文将介绍 Vue.js 中的服务端渲染和客户端渲染的区别…

安全测试:13款免费的安全测试工具,抓紧白嫖不看后悔

目录 1. Excercise in a Box 2. Needle 3. DevSlop 4.移动安全框架(Mobile Security Framework) 5. Frida 6. Nishang 7.Tamper 8.InSpec 9. Faraday 10. Pocsuite 11. Taipan 12.Pacu 13. Secure Guilld 总结 1. Excercise in a Box Excercise in a Box是由英国…

Vue2 前端路由

SPA 单页面应用 只有一个页面(一个html文件) vue-router 组件之间的切换(hash地址与组件间的关系)–前端路由 vue版本与路由版本的对应关系 vue2->router3 vue3->router4 入门 用vue脚手架创建只有babel组件的vue项目…

Vue.js 中的 mixin 和混入有什么区别?

Vue.js 中的 mixin 和混入有什么区别? 在 Vue.js 中,mixin 和混入是两个常用的概念,它们可以帮助我们实现代码的复用和组件间的通信。虽然它们的名字很相似,但它们的作用和用法有所不同。本文将介绍 mixin 和混入的区别&#xff…

在Windows中安装极狐GitLab Runner(解决 Host key verification failed.)

官方文档:https://docs.gitlab.cn/runner/install/windows.html 在Windows中安装极狐GitLab Runner 1.下载GitLab Runner二进制文件,新建一个文件夹(不要有中文),并将二进制文件放入该文件夹,重命名为“git…

最新成果展示:AlInN/GaN DBR模型数据库的开发与应用

由于AlN和GaN之间存在较大的晶格失配和热膨胀失配,导致很难获得高质量的AlN/GaN布拉格反射镜(Distributed Bragg Reflection,DBR)结构。为解决该问题,天津赛米卡尔科技有限公司技术团队基于先进的TCAD仿真设计平台开发…

OpenAI Triton 初探

Triton 2021年发布了1.0,我在调研GPU使用方法的时候知道了有这个东西,但是当时还不了解OpenAI,觉得这个项目太新太小众,并没有深究。现在GPT大火之后,再回过头看看他们的这个东西。 现在相关文档还是很少,…

EXCEL数据计算分析功能助力PID闭环控制优化

EXCEL大家并不陌生,这篇博客记录汇总利用EXCEL进行工作分析的一些技巧,专栏也会持续更新,感谢大家关注评论。首先介绍下工控上用的比较多的模拟量采集,模拟量采集的数学基础大家可以查看下面的博客: PLC模拟量输出 模拟量转换FC S_RTI_博图模拟量输出指令_RXXW_Dor的博客…

INDEMIND:陷入创新焦虑的扫地机器人,下一步该怎么走?

卖不动的扫地机器人,需要翻过高价和智能化两座大山。 卖不动的背后,原因是什么? 视角回到行业,随着基站型全功能扫地机器人的出现,机器人的产品力和使用体验得到明显提升,可以说已经能够极大程度的满足消…

Java中查看堆里的信息

文章目录 前言1 建议无脑的做一件事2 jmp命令3 导入 hprof 文件到Visual VM 中4 查看对象属性值 前言 日常工作中,我们可能会遇到这样的场景: java项目发生了OOM;想知道在某种场景下,堆里的信息,从而确认一些代码功能…

2000道面试必问的Java面试八股文及答案整理(2023版)

说快也快,说不快也不慢! 年前,陆陆续续,好多大厂都在裁员; 年后,又有一大批程序员失业,找不到避风港; 这时候,就有人说了,为什么找工作这么难?…

【技巧】ZIP文件的分卷压缩如何设置 ?

有时候,因为文件过大,我们进行压缩后发现压缩包依旧很大,不方便储存或邮件发送等。 这种情况就需要把文件进行分卷压缩,也就是根据需要的大小,把文件分别压缩成若干个小压缩包。 还不了解的小伙伴,可以看…

入行这几年,我已经快要摸透了软件测试这一行!

目录 前言: 第一年 第二年 第三年 第四年 作为过来人的一些忠告 自动化测试到底应该学什么? 结尾: 前言: 软件测试是通过对软件系统进行测试、诊断和验证,以保证软件系统能够符合用户需求和预期质量标准的过程。 大…

java设计模式之:适配器模式

文章目录 适配器模式定义通用代码实现适用场景案例场景分析一坨坨代码实现适配器模式重构 总结 适配器模式(Adapter Pattern):将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够…

熬夜整理21条避坑指南,细聊该如何让自动化完美运行!

目录 1、引言 2、避坑内容总结 2.1无法定位到元素 2.2 Indentation Error 2.3 PO设计模式类 2.4 页面封装类中没有已定义函数的问题 2.4.1 提示没有该方法 2.4.2 没有定义好的函数 2.5 parater must be str 2.6 继承 2.7 not all arguments curerted during string …

前端web自动化测试:selenium怎么实现关键字驱动

要做 ui 自动化测试,使用关键字驱动可以说是必须会的一种测试方式,它既可以在纯代码的自动化程序中运行,也可以在测试平台中使用。 使用纯代码方式时,自动化工程师先写好一个通用的程序,其他手工测试人员只需要把执行…

Python 中文编码

Python 文件中如果未指定编码,在执行过程会出现报错: #!/usr/bin/python print (“你好,世界”) 以上程序执行输出结果为: File “test.py”, line 2 SyntaxError: Non-ASCII character ‘\xe4’ in file test.py on line 2, b…

接口自动化测试:Python+Pytest+Requests+Allure

本项目实现了对Daily Cost的接口测试: PythonRequests 发送和处理HTTP协议的请求接口Pytest 作为测试执行器YAML 管理测试数据Allure 来生成测试报告。 本项目是参考了pytestDemo做了自己的实现。 1. 项目结构及安装部署 项目结构 api: 接口封装层,…

未来软件测试的5个主要趋势以及软件测试进阶路线

全球各地的企业每天都在发展变化着,以应对市场挑战,满足日益成熟的客户需求。即使是正在进行的技术进步也会使软件测试专家在实践的过程中更加专注和精确。 2021年给软件测试领域带来了新的技术解决方案,以及质量保证和软件测试的实现。与此同…

无线蓝牙耳机哪个品牌好?十款精选的无线蓝牙耳机品牌推荐

蓝牙耳机是一种无线耳机,其通过蓝牙技术与其他设备进行连接,例如手机、电脑、平板电脑等。蓝牙耳机使得用户可以在不受线缆限制的情况下享受音频体验,而且还可以方便地进行通话,目前市场上有许多不同种类和品牌的蓝牙耳机&#xf…