MySQL-InnoDB页结构

简述

MySQL将数据以行的格式保存,而保存这些数据行的地方则是页结构,MySQL以页作为磁盘和内存的交互单位,为了存储多种数据,MySQL中各种各样的页类型,用来存放数据的页称为索引页,MySQL中一个页的大小默认为16KB,并且一个页最少要存放两条记录。

页结构

在这里插入图片描述

  1. File Header:有多个属性,主要包括页号、上一个页的页号、下一个页的页号、undoLog页等。通过记录上下页页号,B+树同一层的页会形成双向链表。
  2. Page Header:保存了多少数据、FreeRecord区域的偏移量、槽的数量等属性。
  3. File Trailter:页结尾的检验和,通过该区域可以判断写入页的时候是否完整。

User Records和Free Records

页刚创建的时候,User Records是不存在的,只有Free Records,每当我们插入一条数据,页都会从Free Records分出区域存储记录(行),这样User Records就存在了,并且随着存入记录,会越来越大,而Free Records则会越来越少,当Free Records所剩的区域不够存下一条记录或者用完时,就要申请一个新的页来存储数据。

Infimum + Supremum

Infimum和Supremum与我们行格式是一样的,User Records中存储的数据主键都是由小到大,Infimum则是这个页中最小的行,而Supremum是这个页最大的行,在行格式的记录头部信息中,有record_type属性,0:该行为数据行,1:索引行,2:Infimum行,3:Supremum行。heap_no属性,该属性是标识行在页的顺序,Infimum + Supremum存了0和1,我们的数据则从2开始递增。因此,Infimum + Supremum和User Records区域中的数据会形成以下图示的关系:
在这里插入图片描述
这里为了方便理解只把一部分的记录头部信息列出:
在这里插入图片描述

  1. delete_flag:该记录是否被删除,如果为1,表示被删除,那么就不会被行形成的单链表连接,但是不代表该行就会被删除释放空间,因为释放该行的空间会涉及空间调整,因此宁愿不释放该空间,在将来如果重新插入该主键的行,就可以不必去申请空间了,因为该行始终存在,并且被删除的行会相互指向形成垃圾链表。
  2. record_type:0:数据行,1:索引行,2:Infimum行,3:Supremum行。
  3. heap_no:标识行在页的顺序,Infimum + Supremum存了0和1,我们的数据则从2开始递增。
  4. next_record:标识下一行记录的偏移量,它并不是指针,图中所示只是为了方便理解,实际上它是一个数值,比如32,那么标识下条数据再往下的32字节的位置,-112标识再向前的112字节的位置,如果为0,标识没有下一条行了。
    当id为2的行delete_flag为1时,上图会变为:
    在这里插入图片描述

Page Directory

通过前面的分析,我们可以看出页内的行会形成一个单向链表,当我们在也查找时,要从infimum开始遍历知道supremum结束,时间复杂度为O(n),如果数据量少还行,但是一个页实际上是可以存储很多数据的,因此,MySQL的设计者用了一个Page Directory区域,槽区域,这个区域就像一个目录,把数据行分成多个组(包括infimum、supremum),Page Directory存储是每一组最大主键的行的偏移量。这样通过二分法,我们可以快速定位要查找的数据在链表中那一块区域。刚开始的时候Page Directory只有infimum和supremum的槽,infimum槽只能有infimum一个行,supremum组可以有1-8个数据行,当加入的数据行到9个时supremum组会拆分成4个行的组和剩下五个行的supremum组,4个行的组成为普通数据行组,存放行数为4-8个数据行。

双向链表,B+树

页内数据形成了单向链表,而页和页之间则形成了双向链表:
在这里插入图片描述
同样的当页有很多数据的时候,遍历依旧很慢,所以设计者效仿了处理行单链表的方法,生成了索引页,从而形成了B+树的存储结构。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值