InnoDB页结构简述

发布时间 2023-07-01 19:51:17作者: WYFC4

InnoDB数据页结构

数据页结构概览

名称 占用字节
File Header(文件头部) 38字节
Page Header(页面头部) 56字节
Infimum+Supremum(页面中的最小记录和最大记录) 26字节
User Records(用户记录) 不确定
Free Space(空闲空间) 不确定
Page Directory(页目录) 不确定
File Trailer(文件尾部) 8字节

记录在页中的存储

User Records部分负责按照指定的行格式存储记录。 每插入一条新记录,都需要从Free Space里申请新的空间。 如果Free Space的全部空间都用完了, 那么这个页也用完,需要申请下一个页了。记录紧密地存储在一起,形成堆(heap)。记录头信息中会保存每条记录在堆中的相对位置,称为heap_no。值得注意的是,在每个页中会额外存储两个记录,一条代表页面中的最小记录(Infimum记录),一条代表页面中的最大记录(Supremum记录)。这两条记录拥有最小的heap_no,相对位置也最靠前。
页中的记录是按照主键的大小比较大小的。头信息中的next_record会保存当前记录的真实数据到下一条记录的真实数据的距离。自然,从这里可以看出,记录实际上是以链表的形式存储的。链表是按照主键大小串联起来的。链表开头就是Infimum记录,结尾是Supremum记录。如果某条记录被删除,该条记录的deleted_flag会被标记为1,next_record也会变成0,上条记录的 next_record也会产生相应变化。但是该条记录并不会被物理删除以防下次再次使用。 n_owned也会产生相应变化,这里暂且不谈。如果删除的记录很多,会利用原始的next_record信息产生一个垃圾链表。

Page Directory(页目录)

为了方便进行大量数据的查找,InnoDB会采用页目录方便查找。其步骤可以归纳为:
1、将包括Infimum记录和Supremum记录在内的所有记录划分为几个组
2、每个组内最后一个(也就是最大的)记录的头信息中的n_owned属性会记录该组总共有多少记录。
3、将每个组最后一条记录的地址偏移量(即该记录的真实数据与页面中第0个字节之间的距离)单独提取出来,按顺序存储到Page Directory(页目录)。页目录中的这些偏移量称为槽(Slot),每个槽占用2个字节。