6.2.3 【MySQL】InnoDB的B+树索引的注意事项

news2024/9/20 10:54:56

6.2.3.1 根页面万年不动窝

B+ 树的形成过程是这样的:

  • 每当为某个表创建一个 B+ 树索引(聚簇索引不是人为创建的,默认就有)的时候,都会为这个索引创建一个 根节点 页面。最开始表中没有数据的时候,每个 B+ 树索引对应的 根节点 中既没有用户记录,也没有目录项记录。
  • 随后向表中插入用户记录时,先把用户记录存储到这个 根节点 中。
  • 当 根节点 中的可用空间用完时继续插入记录,此时会将 根节点 中的所有记录复制到一个新分配的页,比如 页a 中,然后对这个新页进行 页分裂 的操作,得到另一个新页,比如 页b 。这时新插入的记录根据键值(也就是聚簇索引中的主键值,二级索引中对应的索引列的值)的大小就会被分配到 页a 或者 页b 中,而根节点 便升级为存储目录项记录的页。

要注意的是:一个B+树索引的根节点自诞生之日起,便不会再移动。这样只要我们对某个表建立一个索引,那么它的 根节点 的页号便会被记录到某个地方,然后凡是 InnoDB 存储引擎需要用到这个索引的时候,都会从那个固定的地方取出 根节点 的页号,从而来访问这个索引。

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

我们知道 B+ 树索引的内节点中目录项记录的内容是 索引列 + 页号 的搭配,但是这个搭配对于二级索引来说有点儿不严谨。还拿 index_demo 表为例,假设这个表中的数据是这样的:

c1

c2

c3

1

1

'u'

3

1

'd'

5

1

'y'

7

1

'a'

如果二级索引中目录项记录的内容只是 索引列 + 页号 的搭配的话,那么为 c2 列建立索引后的 B+ 树应该长这样:

           

为了让新插入记录能找到自己在那个页里,我们需要保证在B+树的同一层内节点的目录项记录除 页号 这个字段以外是唯一的。所以对于二级索引的内节点的目录项记录的内容实际上是由三个部分构成的:

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

也就是我们把 主键值 也添加到二级索引内节点中的目录项记录了,这样就能保证 B+ 树每一层节点中各条目录项记录除 页号 这个字段外是唯一的。

6.2.3.3 一个页面最少存储2条记录

B+树本质上就是一个大的多层级目录,每经过一个目录时都会过滤掉许多无效的子目录,直到最后访问到存储真实数据的目录。InnoDB 的一个数据页至少可以存放两条记录。

6.2.4 MyISAM中的索引方案简单介绍

InnoDB 中索引即数据,也就是聚簇索引的那棵 B+ 树的叶子节点中已经把所有完整的用户记录都包含了,而 MyISAM 的索引方案虽然也使用树形结构,但是却将索引和数据分开存储:

  • 将表中的记录按照记录的插入顺序单独存储在一个文件中,称之为 数据文件 。这个文件并不划分为若干个数据页,有多少记录就往这个文件中塞多少记录就成了。我们可以通过行号而快速访问到一条记录。但是在插入数据的时候并没有刻意按照主键大小排序,所以我们并不能在这些数据上使用二分法进行查找。
  • 使用 MyISAM 存储引擎的表会把索引信息另外存储到一个称为 索引文件 的另一个文件中。 MyISAM 会单独为表的主键创建一个索引,只不过在索引的叶子节点中存储的不是完整的用户记录,而是 主键值 + 行号 的组合。也就是先通过索引找到对应的行号,再通过行号去找对应的记录!
  • 这一点和 InnoDB 是完全不相同的,在 InnoDB 存储引擎中,我们只需要根据主键值对 聚簇索引 进行一次查找就能找到对应的记录,而在 MyISAM 中却需要进行一次 回表 操作,意味着 MyISAM 中建立的索引相当于全部都是 二级索引 !
  • 如果有需要的话,我们也可以对其它的列分别建立索引或者建立联合索引,原理和 InnoDB 中的索引差不多,不过在叶子节点处存储的是 相应的列 + 行号 。这些索引也全部都是 二级索引 。

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

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

相关文章

S/4 FI之FBL3N/FBL3H/FAGLL03/FAGLL03H的区别

SAP 系统中,为了显示财务凭证行项目,由于不同的时间开发的功能,但实际在使用的过程,到底有些什么样区别? 本文档就是想对这一个问题做一个整体上的说明。 FBL3N,就是传统的行项目报表,在最早的…

刷刷刷——双指针算法

双指针算法 这里的双指针,可能并不是真正意义上的指针,而是模拟指针移动的过程。 常见的有两种: 双指针对撞: 即在顺序结构中,指针从两端向中间移动,然后逐渐逼近 终止条件一般是: left ri…

MATLAB中ischange函数用法

目录 语法 说明 示例 均值的变化 线性区的变化 矩阵数据 ischange函数的功能是查找数据中的突然变化。 语法 TF ischange(A) TF ischange(A,method) TF ischange(___,dim) TF ischange(___,Name,Value) [TF,S1] ischange(___) [TF,S1,S2] ischange(___) 说明 ​…

Python实现机器学习(下)— 数据预处理、模型训练和模型评估

前言:Hello大家好,我是小哥谈。本门课程将介绍人工智能相关概念,重点讲解机器学习原理机器基本算法(监督学习及非监督学习)。使用python,结合sklearn、Pycharm进行编程,介绍iris(鸢尾…

windows10搭建RocketMq

windows10搭建RocketMq 文章目录 windows10搭建RocketMq1.下载二进制RocketMq2.配置环境变量3.启动4.RocketMq控制台安装 1.下载二进制RocketMq 下载链接 2.配置环境变量 变量名:ROCKETMQ_HOME变量值:MQ解压路径 修改runbroker.cmd和runserver.cmd文件 把%CLASSPATH%用引…

SpringBoot + Prometheus + Grafana 打造可视化监控

SpringBoot Prometheus Grafana 打造可视化监控 文章目录 SpringBoot Prometheus Grafana 打造可视化监控常见的监控组件搭配安装Prometheus安装Grafana搭建SpringBoot项目引入依赖示例:监控SpringBoot内置Tomcat线程池的情况grafana创建监控看板 后台SpringBoot服务添加自…

【深度学习】 Python 和 NumPy 系列教程(十):NumPy详解:2、数组操作(索引和切片、形状操作、转置操作、拼接操作)

目录 一、前言 二、实验环境 三、NumPy 0、多维数组对象(ndarray) 1. 多维数组的属性 1、创建数组 2、数组操作 1. 索引和切片 a. 索引 b. 切片 2. 形状操作 a. 获取数组形状 b. 改变数组形状 c. 展平数组 3. 转置操作 a. 使用.T属性 b…

Redis模块四:常见的数据类型和使用

目录 Redis 的 5 大基础数据类型 ①字符串类型(String) ②字典类型(Hash) ③列表类型(List) ④集合类型(Set) ⑤有序集合类型(ZSet) Redis 的 5 大基础数据类型 String——字符串类型 Hash——字典类型 List——列表类型 Set——集合类型 ZSet——有序集合类型 …

后发而先至的腾讯混元大模型,到底有哪些技术亮点?

2023年的夏天已经结束了,但是,围绕AIGC大模型的关注热度,却丝毫没有衰退的意思。 在过去的大半年里,我们亲眼见证了大模型浪潮的崛起,甚至可以说是疯狂。截止7月,国内的大模型数量,已经超过130个…

MySQL与ES数据同步之异步调用

文章目录 简述SpringBoot项目引入依赖配置文件项目结构实体类配置类RabbitMQ交换机队列声明,绑定配置类回调接口配置类 Mapper接口UserMapper接口UserEsMapper Controller类Service接口Service实现类监听类/消费者 简述 上一篇是同步调用,我们在中间加上…

【海思SS626 | 开发环境】VMware17安装Ubuntu 18.04.6

目录 一、下载 Ubuntu 18.04.6 LTS二、VMware17创建虚拟机三、安装Ubuntu18.04LTS四、安装其他软件五、总结 一、下载 Ubuntu 18.04.6 LTS 问题:为什么要下载 Ubuntu18.04.6 LTS 而不是使用最新的,或者其他Linux发行版? 答:在ss6…

Python 图形化界面基础篇:使用框架( Frame )组织界面

Python 图形化界面基础篇:使用框架( Frame )组织界面 引言什么是 Tkinter 框架( Frame )?步骤1:导入 Tkinter 模块步骤2:创建 Tkinter 窗口步骤3:创建框架( F…

如何做到安全上网

随着信息化的发展,企业日常办公越来越依赖互联网,而访问互联网过程中,会遇到各种各样不容忽视的风险,例如员工主动故意的数据泄漏,后台应用程序偷偷向外部发信息,木马间谍软件的外联,以及各种挖…

聚观早报 | 荣耀V Purse定档;哪吒S迎来最新OTA升级

【聚观365】9月13日消息 荣耀V Purse定档 哪吒S迎来最新OTA升级 宝马将向其英国工厂投资7.5亿美元 英伟达称霸AI芯片领域致初创公司融资难 甲骨文第一财季收入约125亿美元增长9% 荣耀V Purse定档 不久前,荣耀官方推出了全新的荣耀Magic V2内折叠屏旗舰&#x…

【Linux从入门到精通】信号(信号保存 信号的处理)

本篇文章接着信号(初识信号 & 信号的产生)进行讲解。学完信号的产生后,我们也了解了信号的一些结论。同时还留下了很多疑问: 上篇文章所说的所有信号产生,最终都要有OS来进行执行,为什么呢?…

在Android studio 创建Flutter项目运行出现问题总结

在Android studio 中配置Flutter出现的问题 A problem occurred configuring root project ‘android’出现这个问题。解决办法 首先找到flutter配置的位置 在D:\xxx\flutter\packages\flutter_tools\gradle位置中的flutter.gradle buildscript { repositories { googl…

相机坐标系 -> 像素坐标系

代码链接:https://github.com/PanJinquan/python-learning-notes/blob/master/modules/utils_3d/camera_tools.py def __cam2pixel(cam_coord, f, c):"""相机坐标系 -> 像素坐标系: (f / dx) * (X / Z) f * (X / Z) / dxcx,ppx260.166; cy,ppy…

分库分表---理论

目录 一、垂直切分 1、垂直分库 2、垂直分表 3、垂直切分优缺点 二、水平切分 1、水平分库 2、水平分表 3、水平切分优缺点 三、数据分片规则 1、Hash取模分表 2、数值Range分表 3、一致性Hash算法 四、分库分表带来的问题 1、分布式事务问题 2、跨节点关联查询…

【FAQ】本地录像视频文件如何推送到视频监控平台EasyCVR进行AI视频智能分析?

安防监控平台EasyCVR支持多协议、多类型设备接入,可以实现多现场的前端摄像头等设备统一集中接入与视频汇聚管理,并能进行视频高清监控、录像、云存储与磁盘阵列存储、检索与回放、级联共享等视频功能。视频汇聚平台既具备传统安防监控、视频监控的视频能…

Vue2电商前台项目——完成Search搜索模块业务

Vue2电商前台项目——完成Search搜索模块业务 Vue基础知识点击此处——Vue.js 文章目录 Vue2电商前台项目——完成Search搜索模块业务一、项目开发的步骤二、各种请求数据并展示数据1、写Search模块的接口2、写Vuex中的search仓库3、组件拿到search仓库的数据(1&…