
目录一、快速走进索引页结构一整体展示说明二内容说明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 SpaceInnoDB 数据页中的 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 会执行以下操作申请新的数据页数据库引擎会在表空间中申请一个新的数据页以继续存储新的记录。更新链表指针新申请的数据页会被链接到现有的数据页双向链表中确保数据页之间的有序连接。维护 B 树结构如果涉及到索引页InnoDB 会维护 B 树结构确保新的数据页在树中的正确位置。主要参考和学习来源《MySQL 是怎样运行的从根儿上理解 MySQL》MySQL InnoDB 索引 (INDEX) 页结构 - doubtful - 博客园https://juejin.cn/post/7216914115260301367mysql数据页和索引页 | Young 小站一文带你了解MySQL之InnoDB 数据页结构-阿里云开发者社区https://www.51cto.com/article/702315.htmlMysql之InnoDB数据页索引页结构解析 流程图模板_ProcessOn思维导图、流程图这样理解Mysql索引阿里面试官也给你点赞_MySQL_慕枫技术笔记_InfoQ写作社区https://www.51cto.com/article/777873.htmlMySQL怎么运行的系列四Innodb索引结构和方案-张柏沛IT博客InnoDB的Page结构 | JieSunn - BLOG【MySQL】InnoDB行格式、数据页结构以及索引底层原理分析_牛客博客27丨从数据页的角度理解B树查询-SQL必知必会-极客时间OceanBase 社区页和区体系结构指南 - SQL Server | Microsoft LearnMySQL InnoDB 聚集索引数据结构 | ellendan