Mysql InnoDb数据页的组成及记录维护
一、Mysql Innodb数据页的组成,单页数据页的大小为16KB,由以下七部分组成:
1.文件头:大小为38个字节。(页的位置,上一页下一页位置,checksum , LSN)
2.数据页头:记录页面的控制信息。大小是56个字节,包括页的左右兄弟页面指针(双向链表),页面的空间使用情况。
3.虚记录:最大虚记录和最小虚记录。
4.记录堆:行记录存储区,分为有效记录和已删除记录、自由空间链表(已删除记录组成的链表)。
5.未分配空间:页面未使用的存储空间。
6.页目录: slot信息。页目录里维护多个 slot ,一个 slot 包含多个行记录。每个 slot 占 2 个字节,记录这个 slot 里的行记录相对页初始位置的偏移量。由于索引只能定位到数据页,而定位到数据页内的行记录还需要在内存中进行二分查找,而这个二分查找就需要借助 slot 信息,先找到对应的 slot ,然后在 slot 内部通过数据行中记录头里的下一个记录地址进行遍历。每一个 slot 可以包含 4 到 8 个数据行。如果没有 slot 辅助,链表本身是无法进行二分查找的。见下图:
7.页尾:页面最后部分,占8个字节,主要存储页面的效验信息。
二、数据页内记录维护:
顺序保证:用逻辑有序(单向链表)。
插入策略:先自由空间链表,后未分配空间。删除操作频繁的话会产生磁盘碎片。
页内查询:选用二分查找。