InnoDB页结构简述
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个字节。
本文作者:WYFC4
本文链接:https://www.cnblogs.com/wyfc4/p/17519821.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步