innerDB数据页结构
我们一个数据页大小为16KB
User Records
我们存储的记录会按照行格式(Compact、Redundant、Dynamic(默认5.7)和Compressed行格式) 存储到 User Records 部分,开始生成页的时候没有User Records 部分,需要从Free Space进行划分一部分给User Records使用,当User Records把Free Space占没了,说明当前页已经使用完了。
现在基于行格式展开来说明一下User Records的使用
delete_mask
占用一个二进制位,用来表示是否被删除。0:没有被删除,1为被删除
删除后记录是存在的,因为User Records的存储结构是基于链表的方式,如果物理删除一条记录,就需要进行重排查。耗费资源
所以基于这些被删除的会存在一个垃圾链表的概念,这个链表记录可重用的空间,当新的一条记录插入表中,会占用这些被删除的空间
min_rec_mask
B+树的每层非叶子节点的最小记录都会添加该标记。
n_onwed
在页目录(page directory)中会被使用,记录每组存储的记录数。
- 对于最小记录所在的分组只能有1条记录
- 最大记录所在的分组拥有的记录条数只能在1~8条之间
- 剩下的分组中记录的条数范围只能在是4~8条之间
heap_no
表示当前记录在本页的位置,也就是在堆中记录当前位置的。内存堆是 MySQL 在执行查询时使用的一种内存结构,用于暂存数据、排序等操作。
record_type
如图:0:普通记录,1:表示b+树非叶子节点 2:最小记录 3:最大记录
next_record
从当前记录的真实数据到下一条真实数据的偏移量(字节),也就是链表的重要位置,指向下一条记录的指针
我们的链表排序方式是基于主键进行自动排序的
如果当前主键是以字符串的形式,那判断大小需要使用Unicode 编码比较
Page Directory(页目录)
他出现的目的是增加查询效率,也就是增加目录,进行快速查询
- 将所有记录(不包括已删除的记录)划分成多个组(参考n_onwed)
- 查看n_onwed表示该组一共多少条记录
- 每组最后一条记录提取出来,按照顺序存储起来靠近页的尾部。这些记录就是所谓的页目录。其中这些页目录存储的偏移量叫做槽(英文名:Slot)
Page Header (页面头部)
比如本页中已经存储了多少条记录,第一条记录的地址是什么,页目录中存储了多少个槽等等,特意在页中定义了一个叫Page Header的部分,它是页结构的第二部分,这个部分占用固定的56个字节,专门存储各种状态信息
File Header(文件头部)
不同类型的页都会以File Header作为第一个组成部分,它描述了一些针对各种页都通用的一些信息,比方说这个页的编号是多少,它的上一个页、下一个页是谁啦吧啦吧啦~这个部分占用固定的38个字节
File Trailer
用来效验 从内存中的数据同步到磁盘是否完成。因为会发生内存在同步磁盘的时候,断电的情况。