mysql deallocate 深度解析MySQL InnoDB 数据页

mysql deallocate 深度解析MySQL InnoDB 数据页

本文基于 MySQL 8.0 版本,从数据页的本质、核心结构、工作机制、与 B+ 树的关联、实战优化五个维度mysql deallocate 深度解析MySQL InnoDB 数据页,详细介绍 数据页——这是理解 存储引擎、索引原理、性能优化的最底层核心。

mysql deallocate

一、数据页的本质1.1 数据页是 存储的最小物理单位

管理数据的核心逻辑是:不以“行”为单位存储数据,而是以“页(Page)”为最小物理存储单位。

1.2 数据页的类型

有多种页类型,不同类型对应不同功能,其中数据页(也叫 B+ 树节点页,类型编号 ) 是最关键的类型:

页类型

作用

数据页(B+ 树节点页)

存储行数据(B+ 树叶子节点)或索引数据(非叶子节点)

undo 日志页

存储事务回滚日志

索引页

存储非叶子节点的索引键+页指针(本质是特殊数据页)

系统页

存储表空间、段、区的元数据

本文主要介绍“数据页(B+ 树节点页)”—— 它是 存储行数据和索引的容器,也是 B+ 树的基本组成单元。

1.3 数据页的核心作用数据存储:所有行数据最终都存储在数据页中,一页可存储多条行记录(取决于行大小,16KB 页通常可存几百行);索引载体:B+ 树的每个节点(叶子/非叶子)都是一个数据页,叶子节点页存行数据,非叶子节点页存索引键+页指针;磁盘 IO 单位: 与磁盘交互的最小单位是页,优化页的使用效率=优化磁盘 IO=提升 MySQL 性能。二、 数据页的核心结构

数据页的结构是固定格式+可变内容,总大小默认 16KB,核心分为 7 个部分,按顺序排列如下(从页头到页尾):

┌─────────────────────────────────────────────────────────────────────┐
│ 1. 文件头(File Header)| 38 字节 | 页的基础元数据                  │
├─────────────────────────────────────────────────────────────────────┤
│ 2. 页头(Page Header)| 56 字节 | 数据页的核心控制信息            │
├─────────────────────────────────────────────────────────────────────┤
│ 3. Infimum/Supermum 记录 | 26 字节 | 页内记录的边界标记            │
├─────────────────────────────────────────────────────────────────────┤
│ 4. 用户记录(User Records)| 可变 | 实际存储的行数据(核心)        │
├─────────────────────────────────────────────────────────────────────┤
│ 5. 空闲空间(Free Space)| 可变 | 页内未使用的空间                │
├─────────────────────────────────────────────────────────────────────┤
│ 6. 页目录(Page Directory)| 可变 | 快速查找页内记录的「目录」     │
├─────────────────────────────────────────────────────────────────────┤
│ 7. 文件尾(File Trailer)| 8 字节 | 页的完整性校验                  │
└─────────────────────────────────────────────────────────────────────┘

下面逐部分拆解,讲清每个部分的存储内容和核心作用:

2.1 1. 文件头(File ):38 字节,页的“身份证”

文件头存储页的全局元数据,用于 识别页的类型、归属、链接关系,核心字段如下(仅列高频核心):

字段名

大小

核心作用

KSUM

4 字节

页的校验和(用于校验页是否损坏)

4 字节

页的偏移量(唯一标识页在表空间中的位置)

2 字节

mysql deallocate

页类型(数据页=,索引页=同数据页)

4 字节

上一个页的偏移量(双向链表的前驱指针)

4 字节

下一个页的偏移量(双向链表的后继指针)

8 字节

页的最后修改 LSN(崩溃恢复时用)

关键作用:2.2 2. 页头(Page ):56 字节,数据页的控制中心

页头存储当前数据页的核心运行状态,核心字段如下:

字段名

大小

核心作用

2 字节

页目录中的槽(slot)数量

2 字节

页内的用户记录数量

2 字节

空闲空间的起始偏移量

2 字节

页内标记为删除的记录大小(可复用空间)

2 字节

最后插入记录的位置偏移量

2 字节

记录插入方向(正序/倒序,优化插入性能)

关键作用:2.3 3. / 记录:26 字节,页内记录的“边界哨兵”

mysql deallocate

这是 自动插入的两条虚拟记录,不是用户数据,用于标记页内记录的边界:

关键作用:2.4 4. 用户记录(User ):可变大小,数据页的核心内容

这是数据页中真正存储用户行数据的区域,也是占用空间最大的部分。

核心特性:行格式存储:用户记录按 的行格式(Row )存储mysql deallocate,支持 、、、 四种(默认 );行格式决定了行数据的存储方式(如 NULL 值是否存储、变长字段的溢出处理);例如 格式会将变长字段(/TEXT)的前 768 字节存在页内,超出部分存到溢出页。记录头信息+行数据:每条用户记录由“记录头信息(5 字节)+ 实际列数据”组成:记录头信息:存储记录的状态(是否删除)、下一条记录的偏移量(单链表指针)、记录类型等;实际列数据:存储用户定义的列值(如 id、name、age 等)。紧凑存储: 会尽可能紧凑存储记录,减少页内空间浪费(如 NULL 值不占空间、数值类型按最小字节存储)。2.5 5. 空闲空间(Free Space):可变大小,页的备用空间

页内未被使用的连续空间,新记录会优先插入到这里。

2.6 6. 页目录(Page ):可变大小mysql deallocate,页内记录的索引

页目录是数据页的内部小索引,用于快速定位页内的记录,避免全页遍历。

核心工作原理:槽(Slot)机制:页目录由多个槽组成,每个槽存储某条记录的偏移量(指向页内的具体记录);分组存储: 会将页内的用户记录按主键/索引键排序后分组,每个组对应一个槽,槽中存储该组最后一条记录的偏移量;二分查找:查找页内记录时,先对页目录的槽进行二分查找mysql deallocate 深度解析MySQL InnoDB 数据页,定位到目标记录所在的组,再遍历该组的记录,大幅减少查找次数。实例:

假设页内有 100 条记录,分成 10 个槽(每个槽对应 10 条记录):

2.7 7. 文件尾(File ):8 字节,页的完整性校验

文件尾只有一个核心作用:校验页是否完整、未损坏。

校验逻辑:

读取/写入页时,会对比文件头和文件尾的校验和、LSN:

三、数据页的核心工作机制3.1 数据页与 B+ 树的关联

的 B+ 树索引本质是数据页的集合,不同层级的页分工明确:

【B+ 树非叶子节点(索引页)】
每个页存储:索引键值 + 子页的偏移量(指向子数据页)
        页A(索引键:100, 200;子页指针:页B、页C、页D)
       /    |    
【B+ 树叶子节点(数据页)】
页B(存储 id 1-100 的行数据) → 页C(id 101-200) → 页D(id 201+)
(叶子节点通过 File Header 的 PREV/NEXT 组成双向链表)

关键流程:查询 id=150 的记录从根节点页A开始,找到索引键 150 对应的子页指针(页C);加载页C到内存( Pool);通过页C的页目录,快速定位到 id=150 的记录;返回记录数据。3.2 页分裂(Page Split):影响性能的核心机制什么是页分裂?

当数据页的空闲空间不足,无法插入新记录时, 会将当前页拆分为两个页,将部分记录迁移到新页——这个过程就是页分裂。

页分裂的触发条件:页分裂的影响:

负面影响:

优化方案:

使用自增整数主键:自增主键插入时mysql deallocate,新记录会追加到当前页的末尾,极少触发页分裂;避免无序插入:如避免用 UUID、随机数作为主键;预分配空间:对大批量插入的表,提前扩展表空间,减少运行时的页分裂。3.3 页合并(Page Merge):空间回收机制什么是页合并?

当数据页的记录被大量删除,空间利用率低于阈值(默认 50%), 会将当前页与相邻的页合并,释放空闲空间——这个过程就是页合并。

核心逻辑:删除记录后, 检查当前页的空间利用率;若利用率 < 50%,尝试合并相邻的兄弟页;合并后,原两个页的记录存入一个页,另一个页标记为空闲,供后续使用;更新父索引页的指针,删除指向被释放页的引用。实战意义:

页合并是 自动回收空间的机制,但频繁的合并会增加性能开销,因此:

3.4 数据页与 Pool(内存交互核心)

不会直接读写磁盘上的页,而是通过 Pool(缓冲池)作为中介:

读取页:先检查 Pool 中是否有目标页,有则直接使用(内存速度),无则从磁盘加载到 Pool;修改页:先修改 Pool 中的页(脏页),后台线程异步将脏页刷到磁盘;淘汰策略: Pool 满时,用 LRU 算法淘汰最久未使用的页。实战优化:四、数据页的关键实战问题4.1 为什么 默认页大小是 16KB?

这是平衡磁盘 IO 效率和内存利用率的最优选择:

4.2 行格式对数据页的影响?

不同行格式决定了行数据在页内的存储方式,直接影响页的利用率:

五、总结数据页是 最小存储/IO 单位:默认 16KB,所有数据/索引都存在页中,磁盘 IO 以页为单位;数据页的核心结构:文件头(链接+校验)、页头(状态)、用户记录(核心数据)、页目录(快速查找)、文件尾(完整性);关键机制:页分裂(无序插入导致,性能损耗)、页合并(空间回收)、 Pool 中介(内存交互);优化关键:用自增主键减少页分裂、调大 Pool 缓存更多页、避免全表扫描、优化页碎片。

掌握 数据页,是理解聚簇索引、B+ 树、 Pool的基础,也是优化 MySQL 性能的底层逻辑—— 所有上层的索引优化、SQL 优化,最终都要落到数据页的高效使用上!

mysql deallocate

公告:
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299

资源库 - 资源分享下载网 » mysql deallocate 深度解析MySQL InnoDB 数据页

常见问题FAQ

关于资源售价和售后服务的说明?
本站所有资源的标价均为本站收集资源的辛苦费,不代表资源本身的价值。软件是高智慧高价值的商品,不可能是白菜价。本站资源标价只是赞助费用,收取的赞助费仅用来维持本站的日常运营!毕竟收集整理资料需要投入云计算资源和站长大量的精力。
代码有没有售后服务和技术支持?
由于代码的运行具有不可预见性,本站不保证代码完整可运行,不提供技术支持和售后服务。 本站原创代码都是站长自己开发的,可以有偿提供技术支持服务。 网站里标明【亲测】的代码都是站长亲测过的,其他的代码由于精力有限,没有一一测试,不能保证代码就一定能够使用,更没有技术支持服务,下载前请自行斟酌。
有没有搭建服务?
由于搭建服务比较费时费力,所以本站除了原创代码外均不提供搭建服务。本站分享代码纯属兴趣爱好,不以盈利为目的,请勿咨询有没有搭建服务,谢谢理解。
链接地址失效了怎么办?
请带上资源链接地址联系客服,工作时间内我们看到后将第一时间回复。
关于解压密码
本站资源一般都没有加密,如果发现需要解压密码的,那么就输入 hao.35dc.com 试试。

发表评论

资源库,由老程序员细心甄别、精心筛选,只为提供优质的源码资源

关于我们 联系我们