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

一、根页面万年不动

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

但实际上 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.mfbz.cn/a/26587.html

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

相关文章

单例模式C++实现和观察者模式C++实现

目录 1、单例模式介绍 2、单例代码实现 2.1 static介绍 2.2 C中static的三种用法: (1)静态局部变量 (2)静态成员变量 (3)静态成员函数 3、观察者模式介绍 4、观察者代码实现 1、单例模…

2023年十大最佳自动化测试工具(建议收藏)

Best Automation Testing Tools for 2023 对更快交付高质量软件(或"快速质量")的需求要求组织以敏捷,持续集成(CI)和DevOps方法论来寻找解决方案。测试自动化是这些方面的重要组成部分。最新的《 2018-2019…

使用koa2搭建后端服务器

目录 第一步 第二步 第三步 第四步 第五步 流程说明 1.配置连接数据库 2.添加Schema模型 3.配置路由接口 第一步 npm i -g koa-generator 第二步 koa2 server 第三步 cd server && npm install 第四步 将服务器拖进编译器运行 npm run dev 在浏览器输入…

迅为RK3568开发板2800页手册+220集视频

iTOP-3568开发板采用瑞芯微RK3568处理器,内部集成了四核64位Cortex-A55处理器。主频高达2.0Ghz,RK809动态调频。集成了双核心架构GPU,ARM G52 2EE、支持OpenGLES1.1/2.0/3.2OpenCL2.0、Vulkan 1.1、内高性能2D加速硬件。 内置NPU 内置独立NP…

SpringBoot生成RESTful API文档

由于我一开始学习的SpringBoot是3以上版本,所以我这里用到的也是支持和SpringBoot3能够整合的SpringDoc 这里先说一下,其实SpringDoc就是Swagger3版本,我一开始整合的2版本,比较麻烦况且最后SpringBoot程序都启动不了了&#xff0…

信息竞赛笔记(2)––快速幂

目录 快速幂 定义 分析 代码 递归实现 非递归实现(通用方法) 模意义下取幂 快速幂 定义 快速幂,二进制取幂(Binary Exponentiation,也称平方法),是一个在的时间内计算的小技巧,而暴力的计算需要的时间。 这个技巧也常常用在非计算的场景,因为它可…

yolov5部署到android studio

目录 环境获取demo将pt文件导出为ptl文件修改demo修改PrePostProcessor增加ptl文件并增加类别文件修改MainActivity 大功告成 环境 Ubuntu22.10 Pytorch2.0.1cu117 Android Studio Flamingo | 2022.2.1 Patch 1 获取demo git clone https://github.com/pytorch/android-demo…

day43|动态规划6-完全背包及其应用-零钱兑换II-组合总和IV

完全背包 前情提要: 0-1背包指的是给定背包重量,将物品放入背包中,使得背包中的物品达到最大的价值。(每个物品只能往其中放一次) 在0-1背包问题中,第二层for循环需要是倒序遍历才可以保证每个物品只使用一…

重估端到端原则

评价技术迭代的旧的定势眼光来自于该技术诞生时。 1970/80/90 年代,相比传输带宽技术,处理器更强。网络协议倾向于字段多,字段小且紧凑,尽可能减少传输量,用 “算法技巧” 等价,如果 TCP 序列号 48 位&…

使用 Docker 部署 Jenkins 代理(主从)控制服务器

自动化是 DevOps 的核心。各种自动化工具和技术真正实现了持续集成和持续交付的概念。这些工具多年来发展迅速,但似乎永远存在的一个名字是Jenkins。 我们不会在这篇文章中讨论 CI-CD 的介绍性概念,也不会浪费时间展示 Jenkins 安装步骤。如果您是 Jenk…

字节面试这么难?6年测开被暴虐.....

前几天我朋友跟我吐苦水,这波面试又把他打击到了,做了快6年软件测试员。。。为了进大厂,也花了很多时间和精力在面试准备上,也刷了很多题。但题刷多了之后有点怀疑人生,不知道刷的这些题在之后的工作中能不能用到&…

【python】之loguru库,好用的日志管理库!

在 Python 中用到日志记录,那就不可避免地会用到内置的 logging标准库 。虽然logging 库采用的是模块化设计,你可以设置不同的 handler 来进行组合,但是在配置上通常较为繁琐;而且如果不是特别处理,在一些多线程或多进…

Nautilus Chain全球行分享会,深圳站圆满举办

在北京时间 6 月 4 日,由 Nautilus Chain 主办的“Layer3 模块化区块链的发展探讨”为主题的全球行活动,在深圳(深圳南山区清华研究院)顺利举办,本次分享会联合主办方还包括 Stanford Blockchain Accelerator、Zebec …

OpenGL简介

1.简介 一般它被认为是一个API,包含了一系列可以操作图形、图像的函数。然而,OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification)。OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值。…

开发一个收废品小程序步骤

随着环保意识的提升和可持续发展的迫切需求,废品回收成为了一个重要的议题。预约上门回收小程序的开发为用户提供了方便、快捷的废品回收服务,促进了废品资源的再利用和环保行动的推进。本文将介绍开发预约上门回收小程序的流程,以帮助开发人…

IDEA启动图片更改替换(2021.1/2022及其之后的版本)

目录 先说2022.1及其之后的版本: 2022.1之前的版本: 2022其他版本修改方法 最近一直在整理接口数据,盯屏幕太久了,然后打开IDEA突然感觉这个启动页面好刺眼,正好整理工作做完了,中午有空就找了下方法,发现了不少坑,…

Linux命令(26)之uptime

Linux命令之uptime 1.uptime介绍 linux命令uptime是用来为用户提供系统从开启到当前运行uptime命令时系统已运行的时长信息,除此之外,还提了系统启动时间,当前登录用户,系统平均负载信息。 2.uptime用法 uptime [参数] uptime…

ChatGPT 提示的艺术 —— 如何编写清晰有效提示指南

ChatGPT 提示的作用 正如我们之前提到的那样,ChatGPT 对话中使用的提示的质量可以显著影响对话的成功。定义清晰的提示可以确保对话保持在正确的轨道上,并涵盖用户感兴趣的主题,从而产生更引人入胜和信息丰富的体验。 那么什么样的 ChatGPT…

Linux进程间通信——管道,共享内存,消息队列,信号量

进程间通信 文章目录 进程间通信进程间通信的方式进程间通信的概念如何实现进程间通信管道什么是管道 进程间怎么通信 匿名管道pipe函数创建管道通信读写特征写慢读快写快读慢写端关闭,读端读完读端关闭,写端? 管道特征 命名管道命名管道特性…

2023接口自动化测试,完整入门篇(超详细~)

一、自动化测试 众所周知,自动化测试已经成为软件项目中不可或缺的测试方法。基于用户交互界面(GUI)的自动化测试方法具有模拟用户行为和过程可视化的特点,因此受到了广大入门自动化人士的喜爱。诸如:QTP、Selenium等…
最新文章