mysql学习(二) innerDB数据页结构

90 阅读3分钟

innerDB数据页结构

我们一个数据页大小为16KB

image.png

image.png

User Records

我们存储的记录会按照行格式(Compact、Redundant、Dynamic(默认5.7)和Compressed行格式) 存储到 User Records 部分,开始生成页的时候没有User Records 部分,需要从Free Space进行划分一部分给User Records使用,当User Records把Free Space占没了,说明当前页已经使用完了。

image.png 现在基于行格式展开来说明一下User Records的使用

image.png

image.png

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

从当前记录的真实数据到下一条真实数据的偏移量(字节),也就是链表的重要位置,指向下一条记录的指针

image.png 我们的链表排序方式是基于主键进行自动排序的
如果当前主键是以字符串的形式,那判断大小需要使用Unicode 编码比较

Page Directory(页目录)

他出现的目的是增加查询效率,也就是增加目录,进行快速查询

  • 将所有记录(不包括已删除的记录)划分成多个组(参考n_onwed)
  • 查看n_onwed表示该组一共多少条记录
  • 每组最后一条记录提取出来,按照顺序存储起来靠近页的尾部。这些记录就是所谓的页目录。其中这些页目录存储的偏移量叫做槽(英文名:Slot)

image.png

Page Header (页面头部)

比如本页中已经存储了多少条记录,第一条记录的地址是什么,页目录中存储了多少个槽等等,特意在页中定义了一个叫Page Header的部分,它是页结构的第二部分,这个部分占用固定的56个字节,专门存储各种状态信息

image.png

File Header(文件头部)

不同类型的页都会以File Header作为第一个组成部分,它描述了一些针对各种页都通用的一些信息,比方说这个页的编号是多少,它的上一个页、下一个页是谁啦吧啦吧啦~这个部分占用固定的38个字节

image.png

File Trailer

用来效验 从内存中的数据同步到磁盘是否完成。因为会发生内存在同步磁盘的时候,断电的情况。