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
信息产生一个垃圾链表。