mysql的页结构

这篇文章是自己学习mysql随手写的杂记,编辑混乱且不够严谨,请勿参考,谢谢!

mysql的记录格式是放在数据页中的,准确的说是user records部分。一个页大小为16KB,数据页是mysql和磁盘交互的基本单位。mysql出于不同的目的设计了不同类型的数据页,但页的结构是相同的,不同的是不同页中的页结构填充的内容是有差异的。

页的结构如下所示:

File header

Page header

Infimum+supremum

User records

Free space

Page directory

File tailer

File header和File tailer是所有页通用的,File header里包含了以下重要部分:

  • 校验和
  • 页号
  • 上一页页号
  • 下一页页号
  • 页类型
  • 所属表空间
  • LSN-日志序列号

校验和是为了校验页数据的完整性。页号唯一标示该页,上一页页号和下一页页号分别指向上一页的页号和下一页的页号,页之间会形成双链表

页类型有许多分类,存储记录的为索引页。

File tailer检验页数据是否完整正确,在页中数据变动时,比如新插入一条记录,在File header中会存一个变动后的校验和,数据写入磁盘时,File header中的校验和会先写入,待数据写入完成后再更新File tailer的检验和,如果数据刷盘过程中出现问题,则两个地方的校验和不一致,就表示数据有误。

mysql存储记录的页称之为数据页或为索引页。Page header是数据页专有的部分,它其中记录了当前数据页有多少槽,有多少记录等信息。

Infimum+supremum存的是两条伪记录,这两条记录有着如下的约定:

  • Infimum记录的下一条记录是页中最小的记录。
  • 页中最大的记录的下一条记录是supremum记录。

上面所说的大小是按照主键来比较的。

user records部分是真正存储记录的地方,一开始页是没有这块区域的,当向页中新插入一条记录时,会向free space申请记录大小的空间作为user records空间存储记录,当free space用完时就不存在了。free space是页中尚未使用的空间,其和user records,page directory一样大小是不确定的,其他几部分大小是确定的。

Page directory是页目录,存储的是页中某些记录地址偏移量。说到这部分就不得不提记录的行格式的头信息部分。

  • delete_mask:是否删除的标记,若删除了则标记为1,但并未从物理磁盘中删除,而是将删除的记录形成垃圾链表,为后续空间重用。
  • heap_no:记录在当前页中的位置,有两条伪记录Infimum+supremum此处的值分别为0和1。
  • record_type:记录类型,0-普通记录,1-B+树非叶子节点,2-最小记录infimum,3-最大记录supremum
  • n_owned:当前记录拥有的记录数。
  • next_record:下一条记录相对于当前记录的地址偏移量。

mysql会对记录进行分组,分组的目的其实为了在进行记录查找时提高二分查找的效率。每一个分组称为槽,槽中的最大记录的地址偏移量(相对于页面地址0字节)会被提取出来顺序放在page directory的尾部,即:

分组中的记录条数有着这样的规定:

  • 最小记录所在分组记录数只能为1条。
  • 最大记录所在分组记录数为1~8条。
  • 其他分组记录条数为4~8条。

开始时,页中只有两个分组infimum和supremum,当新插入一条记录时,会查找主键大于此记录且差值最小的槽,将该记录加入槽中,修改最大记录的n_owned值。当组内记录数到达8个,新插入记录时,原来的组会进行分裂,分裂为2个组,一组4条记录,一组5条记录,修改对应的n_owned值,新增分组最大记录的地址偏移量会加入到Page directory中。

在页中进行记录查找时,会进行如下两步:

  • 确定记录所在的槽,找到该槽的最小记录。
  • 顺序遍历该槽的所有记录。

需要注意的是:页中的记录是按照主键从小到大形成的单链表,页之间是双链表。

完。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值