解读InnoDB数据库索引页与数据行的紧密关联

目录

一、快速走进索引页结构

(一)整体展示说明

(二)内容说明

File Header(文件头部)

Page Header(页面头部)

Infimum + Supremum(最小记录和最大记录)

User Records(用户记录)

 Free Space(空闲空间)

Page Directory(页面目录)

File Trailer(文件尾部)

二、索引页与记录行的简单关系说明

(一)数据页的双向链表结构

(二)记录行的单向链表结构

三、InnoDB 数据页中的 User Records 与 Free Space

(一)页满前的处理

初始状态

存储过程

(二)页满后的处理

主要参考和学习来源


干货分享,感谢您的阅读!快速了解索引页结构和数据行的直接关系。前提知识如下:

文章说明具体链接

数据行格式内容分析

探究InnoDB Compact行格式背后-CSDN博客
数据行头信息各个属性探究解析MYSQL行头信息数据行格式分析_jdk 协程-CSDN博客
解析数据行内部单向链表策略数据库记录行在页内查询探索分析_检查代码中循环依赖-CSDN博客

一、快速走进索引页结构

在InnoDB存储引擎的世界里,数据存储和管理就像是一座繁忙而有序的城市。在这座城市中,每一块16KB大小的土地都被称为一个“页”(Page),而这些页是城市基础设施的核心,其主角就是“索引页”(INDEX页),这些页专门用于存储我们表中的实际记录数据,因此也被称为“数据页”(Data Page)。

(一)整体展示说明

索引页就像是城市中的一栋多层大厦。这栋大厦不仅要存放数据,还需要具备高效的检索功能。为了达到这个目的,InnoDB使用了一种高效的B+树结构,每个索引页就是这棵大树上的一个节点。索引页的大小固定为16KB,这个大小经过优化,既能高效利用磁盘空间,又能在内存中快速读取。整体页展示如下:

在这栋大厦中,各个部分各司其职,确保数据的高效存储和快速访问。File Header是大厦的门卫,Page Header是楼层管理,Infimum和Supremum是地基和天花板,User Records是居民,Free Space是预留的空房间,Page Directory是导航系统,File Trailer是安防系统。

(二)内容说明

File Header(文件头部)

占用空间38 字节,文件头部存储了页的一些基础信息:

  • Page Type(页类型):标识该页的类型(如数据页、索引页)。
  • Page Number(页号):当前页在表空间中的唯一编号。
  • Checksum(校验和):用于检测页在读写过程中的完整性。

具像化理解:就像是办公楼的铭牌,记录了楼的基本信息和身份标识。

Page Header(页面头部)

占用空间56 字节,页面头部包含数据页特有的信息:

  • Number of Records(记录数量):当前页中存储的记录数量。
  • Free Space Pointer(空闲空间指针):指向页中第一个可用的空闲空间位置。
  • Heap Top(堆顶位置):记录当前页中数据存储的最高位置。
  • Page Level(页级别):表示当前页在 B+ 树中的层级。

具像化理解:相当于楼的管理办公室,记录了楼内的各种管理信息,如有多少办公室空闲。

Infimum + Supremum(最小记录和最大记录)

占用空间26 字节,这两个虚拟记录用于定义页中的记录范围:

  • Infimum Record(最小记录):一个特殊的最小记录,用于标示页的起始。
  • Supremum Record(最大记录):一个特殊的最大记录,用于标示页的结束。

具像化理解:类似楼的基础和屋顶,标示了楼的起点和终点。

User Records(用户记录)

占用空间不确定,实际存储的用户数据记录:

  • Record Header(记录头部):包含记录的元数据,例如记录长度和下一条记录的指针。
  • Record Data(记录数据):实际的数据内容,包括各字段的值。

具像化理解:实际的办公室,里面有员工在工作,记录了具体的数据内容。

 Free Space(空闲空间)

占用空间不确定,空闲空间用于存储新插入的记录,随着记录的插入,空闲空间逐渐减少:

  • Insertions(插入):当有新记录插入时,系统会在此区域寻找合适的空闲位置。
  • Deletions(删除):删除记录后,空间会返回到空闲区域供新记录使用。

具像化理解:尚未出租的办公室,未来可以容纳新的员工(数据)。

Page Directory(页面目录)

占用空间不确定,页面目录包含记录的相对位置,用于快速检索记录:

  • Directory Slots(目录槽):指向页中各记录的位置,便于快速定位和检索。
  • Efficiency(效率):通过目录可以快速定位记录,提高检索效率。

具像化理解:大楼的导览图,帮助快速找到特定的办公室(记录)。

File Trailer(文件尾部)

占用空间8 字节,文件尾部包含校验信息,用于验证页的完整性:

  • Checksum(校验和):再次验证页的数据完整性,确保数据在读写过程中未被破坏。

具像化理解:大楼的安保系统,确保大楼的安全和完整性。

二、索引页与记录行的简单关系说明

在 InnoDB 中,数据页通过双向链表连接,每个数据页内的记录行按照主键值从小到大的顺序组成单向链表,并且每个数据页都有一个页目录用于快速定位记录。

查找记录时,先在页目录中使用二分法定位到特定槽,再在该槽对应的记录组中顺序遍历找到目标记录。通过这种设计,InnoDB 能够高效地管理和查找数据,确保数据库系统的高性能和可靠性。

(一)数据页的双向链表结构

每个数据页被组织成一个双向链表,这意味着每个数据页都有指向前一个页和后一个页的指针(File Header 记录了页的基础信息和链表指针)。通过这种双向链表结构,InnoDB 可以方便地进行数据页的插入、删除和遍历操作。这种设计保证了数据页之间的高效连接和管理。

(二)记录行的单向链表结构

在每个数据页中,记录行按照主键值从小到大的顺序组织成一个单向链表。这种有序的结构使得在数据页内查找记录变得更加高效。每条记录不仅存储了自身的数据,还包含指向下一条记录的指针,这样可以顺序遍历记录。

每个数据页都有一个页目录,页目录可以看作是数据页内的索引结构。页目录将记录分成多个组,每个组在页目录中都有一个槽。通过页目录,InnoDB 可以快速定位到特定记录所在的组,从而减少遍历记录的时间。

当需要通过主键查找某条记录时,InnoDB 会先在页目录中使用二分法快速定位到对应的槽。页目录中的槽指向该槽对应的记录组,接着在该组中遍历记录,直到找到目标记录。这种查找过程结合了二分查找和顺序遍历的优点,既高效又精确。

三、InnoDB 数据页中的 User Records 与 Free Space

InnoDB 数据页中的 User Records 和 Free Space 部分密切相关。随着记录的不断插入,Free Space 部分的空间会逐渐分配给 User Records 部分,直到 Free Space 被完全消耗。当一个数据页满了之后,InnoDB 会申请新的数据页并将其链接到现有的双向链表中,继续存储新的记录。也就是在页未满前页的存储主要在User Records 和 Free Space发生,页满后将触达到双向链表页中。

(一)页满前的处理

初始状态
  • User Records:初始为空,没有实际数据存储。
  • Free Space:占据大部分页空间,等待新记录的插入。
存储过程
  • 记录插入:当用户插入一条记录时,系统会从 Free Space 部分中申请一个合适大小的空间用于存储这条记录。这条记录被存储到 User Records 部分。
  • 空间调整:随着记录的插入,User Records 部分逐渐增大,存储越来越多的用户数据。同时,Free Space 部分的可用空间减少,逐步被 User Records 部分替代。
  • 页满状态:当 Free Space 部分被完全消耗,整个数据页被 User Records 部分占据,意味着该页已满,无法再存储新的记录。

(二)页满后的处理

当一个数据页中的 Free Space 部分被完全替代为 User Records 部分后,该页就被认为已满。此时,InnoDB 会执行以下操作:

  1. 申请新的数据页:数据库引擎会在表空间中申请一个新的数据页,以继续存储新的记录。
  2. 更新链表指针:新申请的数据页会被链接到现有的数据页双向链表中,确保数据页之间的有序连接。
  3. 维护 B+ 树结构:如果涉及到索引页,InnoDB 会维护 B+ 树结构,确保新的数据页在树中的正确位置。

主要参考和学习来源

《MySQL 是怎样运行的:从根儿上理解 MySQL》

https://www.cnblogs.com/dbf-/p/11891530.html

https://juejin.cn/post/7216914115260301367

mysql数据页和索引页 | Young 小站

一文带你了解MySQL之InnoDB 数据页结构-阿里云开发者社区

https://www.51cto.com/article/702315.html

Mysql之InnoDB数据页(索引页)结构解析 流程图模板_ProcessOn思维导图、流程图

这样理解Mysql索引,阿里面试官也给你点赞_MySQL_慕枫技术笔记_InfoQ写作社区

https://www.51cto.com/article/777873.html

MySQL怎么运行的系列(四)Innodb索引结构和方案-张柏沛IT博客

InnoDB的Page结构 | JieSunn - BLOG

【MySQL】InnoDB行格式、数据页结构以及索引底层原理分析_牛客博客

27丨从数据页的角度理解B+树查询-SQL必知必会-极客时间

OceanBase 社区

页和区体系结构指南 - SQL Server | Microsoft Learn

MySQL InnoDB 聚集索引数据结构 | ellendan

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

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

相关文章

多模态大模型 - MM1

1. 摘要 本文主要通过分析模型结构和数据选择讨论如何构建一个好的多模态大模型(MLLM),并同时提出了MM1模型,包括30B dense版本和64B的MoE版本。 具体贡献: 模型层面:影响效果的重要性排序为:…

昇思25天学习打卡营第10天|NLP-RNN实现情感分类

打卡 目录 打卡 任务说明 流程 数据准备与加载 加载预训练词向量(分词) 数据集预处理 模型构建 Embedding RNN(循环神经网络) LSTM 全连接层 损失函数与优化器 训练逻辑 评估指标和逻辑 模型训练与保存 模型加载与测试 自定义输入测试 …

周报(1)<仅供自己学习>

文章目录 一.pytorch学习1.配置GPU2.数据读取问题1(已解决问题2(已解决 3.卷积的学习 二.NeRF学习1.介绍部分问题1(已解决 2.神经辐射场表示问题2(已解决问题3(已解决问题4(已解决问题5:什么是视…

1-5岁幼儿胼胝体的表面形态测量

摘要 胼胝体(CC)是大脑中的一个大型白质纤维束,它参与各种认知、感觉和运动过程。尽管CC与多种发育和精神疾病有关,但关于这一结构的正常发育(特别是在幼儿阶段)还有很多待解开的谜团。虽然早期文献中报道了性别二态性,但这些研究的观察结果…

Armv8-R内存模型详解

目录 1.内存模型的必要性 2.Armv8-R内存模型分类 2.1 Normal memory 2.2 Device Memory 2.2.1 Gathering 2.2.2 Reordering 2.2.3 Early Write Acknowledgement 3.小结 大家好,今天是悲伤的肌肉。 在调研区域控制器芯片时,发现了S32Z、Stellar …

从Centos7升级到Rocky linux 9后,网卡连接显示‘Wired connection 1‘问题解决方法

问题描述 从Centos7升级到Rocky9后, 发现网卡eth0的IP不正确。通过nmcli查看网卡连接,找不到name为eth0的连接,只显示’Wired connection 1’ 查看/etc/NetworkManager/system-connections/,发现找不到网卡配置文件。 原因分析 centos7使…

git取消合并:--hard 或 --merge

第一步:查了git日志 git reflog如下,运行上述命令后,可以看见所有的提交哈希(id) 第二步 查看到上述所有的提交记录后,有如下方法去回退 方法1:--hard 确定上一次提交的哈希值 git reset…

RK3568笔记三十八:DS18B20驱动开发测试

若该文为原创文章,转载请注明原文出处。 DS18B20驱动参考的是讯为电子的单总线驱动第十四期 | 单总线_北京迅为的博客-CSDN博客 博客很详细,具体不描述。 只是记录测试下DS18B20读取温度。 一、介绍 流程基本和按键驱动差不多,主要功能是…

内存RAS技术介绍:内存故障预测

故障预测是内存可靠性、可用性和服务性(RAS)领域中的一个重要方面,旨在提前识别潜在的不可纠正错误(UE),以防止系统崩溃或数据丢失。 4.1 错误日志记录与预测基础 错误一般通过Linux内核模块Mcelog记录到…

Matlab 判断直线上一点

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 判断一个点是否位于一直线上有很多方法,这里使用一种很有趣的坐标:Plucker线坐标,它的定义如下所示: 这个坐标有个很有趣的性质,我们可以使用Plucker坐标矢量构建一个Plucker矩阵: 则它与位于对应线上的齐次点…

鸿蒙语言基础类库:【@system.configuration (应用配置)】

应用配置 说明: 从API Version 7 开始,该接口不再维护,推荐使用新接口[ohos.i18n]和[ohos.intl]。本模块首批接口从API version 3开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import configurati…

uniapp启动图延时效果,启动图的配置

今天阐述uniapp开发中给启动图做延迟效果,不然启动图太快了,一闪就过去了; 一:修改配置文件:manifest.json "app-plus" : {"splashscreen" : {"alwaysShowBeforeRender" : false,"…

vue学习day09-自定义指令、插槽

29、自定义指令 (1)概念:自己定义的指令,可以封装一些dom操作,扩展额外的功能。 (2)分类: 1)全局注册 2)局部注册 3)示例: 让表…

前端Vue组件化实践:自定义银行卡号格式化组件的探索与应用

在前端开发中,随着业务逻辑的复杂化和应用规模的扩大,传统的一体式开发方式逐渐显露出其局限性。任何微小的改动或新功能的增加都可能牵一发而动全身,导致整体逻辑的修改,进而增加了开发成本和维护难度。为了解决这一问题&#xf…

Java软件设计模式-单例设计模式

目录 1.软件设计模式的概念 2.设计模式分类 2.1 创建型模式 2.2 结构型模式 2.3 行为型模式 3.单例设计模式 3.1 单例模式的结构 3.2 单例模式的实现 3.2.1 饿汉式-方式1(静态变量方式) 3.2.2 懒汉式-方式1(线程不安全) 3.…

数据结构之初始二叉树(2)

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏:数据结构(Java版) 二叉树的前置知识(概念、性质、、遍历) 通过上篇文章的学习,我们…

STM32第十八课:SPIFlash

目录 需求一、SPI概要二、SPI配置1.开时钟2.配置IO3.配置&使能SPI 三、FLash操作函数1.SPI发送数据2.FLASH写使能3.FLASH等待操作完成4.FLASH页写操作5.FLASH读操作6.FLASH扇区擦除 四、需求实现 需求 通过SPI控制FLash进行数据的保存和删除。 一、SPI概要 在我们使用UA…

oracle控制文件详解以及新增控制文件

文章目录 oracle控制文件1、 控制文件包含的主要信息如下:2、查看目前系统的控制文件信息,主要是查看相关的字典视图 oracle新增控制文件 oracle控制文件 控制文件是一个很小的二进制文件(10MB左右),含有数据库结构信息,包括数据…

(leetcode学习)15. 三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例 1&a…

浅谈全量微调和PEFT高效微调(LoRA)

浅谈全量微调和LoRA微调 全量微调Full Fine-Tuning 全量微调是指在预训练的大型模型基础上调整所有层和参数,‌使其适应特定任务的过程。‌这一过程使用较小的学习率和特定任务的数据进行,‌可以充分利用预训练模型的通用特征 高效微调 高效微调&…