InnoDB数据页结构

InnoDB数据页结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WZDLgQSZ-1616249113439)(C:\Users\10374\AppData\Roaming\Typora\typora-user-images\image-20210320201224155.png)]

名称中文名占用空间大小简单描述
File Header文件头部38字节页的一些通用信息
Page Header页面头部56字节数据页专有的一些信息
Infimum+Supremum页面中最小记录和最大记录26字节两个虚拟的记录
User Records用户记录不确定用户存储的记录内容
Free Space空闲空间不确定页中尚未使用的空间
Page Directory页目录不确定页中某些记录的相对位置
File Trailer文件尾部8字节校验页是否完整

记录头信息

名称大小(位)描述
预留位11没有使用
预留位21没有使用
deleted_flag1标记该记录是否被删除
min_rec_flag1B+树的每层非叶子节点中最小的目录项记录都会添加该标记
n_owned4一个页面中的记录会被分成若干个组,每个组中有一个记录是“带头大哥”,其余的记录都是“小弟”。“带头大哥”记录的n_owned值代表该组中所有的记录条数,“小弟”记录的n_owned值都为0
heap_no13表示当前记录在页面堆中的相对位置
record_type3表示当前记录的类型,0表示普通记录,1表示B+树非叶子节点的目录项记录,2表示Infimum记录,3表示Supremum记录
next_record16表示下一条记录的相对位置

deleted_flag:值为0没有被删除,值为1表示记录被删除了。

InnoDB会自动给每个页里面添加两条记录,称为伪记录。一条代表最小记录,heap_no值为0,一条代表页面最大记录,heap_no值为1。记录大小就是键值的大小。Infimum和Supremum这两条记录都是由5字节的记录头和8字节的固定单词组成。

记录在表中是一个单向链表,下一个记录是按照主键值从小到大的顺序排列的下一条记录。本页主键值最大的用户记录的下一条记录是Supremum记录。

被删除的记录不会从磁盘上移除,但是会形成一个垃圾链表,所以heap_no值也仍然保持不变。如果删除一个记录,那么仅仅将它的deleted_flag改成1,然后将指向它的指针指向它的下一个记录,该组中带头大哥的n_owned的值也减一。如果重新插入该值,则会复用这个被删除的记录。

页目录

  1. 将所有正常的记录划分成几个组
  2. 将每组的最后一个记录作为带头大哥,其余的记录是小弟,带头大哥的n_owned表示该组中有几条记录
  3. 将每组中最后一条记录在页面中的地址偏移量提取,存储到页尾部的地方,这个地方就是Page Directory。地址偏移量为

规定:对于Infimum记录所在的分组只能有1条记录,Supremum记录所在的分组只能在1到8条之间,剩下的分组中记录条数范围在4到8之间。

查找记录:

  • 先通过二分法查找对应的槽
  • 然后找到记录所在槽后,从上一个槽的记录顺序向下找

页面头部

状态名称占用空间大小描述
PAGE_N_DIR_SLOTS2字节在页目录中的槽数量
PAGE_HEAP_TOP2字节还未使用的空间最小地址,也就是说从该地址之后就是Free Space
PAGE_N_HEAP2字节第1位表示本记录是否为紧凑型的记录,剩余的15位表示本页的堆中记录的数量
PAGE_FREE2字节各个已删除的记录通过next_record组成一个单向链表,这个单向链表中的记录所占用的存储空间可以被重新利用;PAGE_FREE表示该链表头结点对应记录在页面中的偏移量
PAGE_GARBAGE2字节已删除记录占用的字节数
PAGE_LAST_INSERT2字节最后插入记录的位置
PAGE_DIRECTION2字节记录插入的方向
PAGE_N_DIRECTION2字节一个方向连续插入的记录数量
PAGE_N_RECS2字节该页中用户记录的数量
PAGE_MAX_TRX_ID8字节修改当前页的最大事务id,该值仅在二级索引页面中定义
PAGE_LEVEL2字节当前页在B+树中所处的层级
PAGE_INDEX_ID8字节索引ID,表示当前页属于哪个索引
PAGE_BTR_SEG_LEAF10字节B+树叶子节点段的头部信息,仅在B+树的根页面中定义
PAGE_BTR_SEG_TOP10字节B+树非叶子节点段的头部信息,仅在B+树的根页面中定义

文件头部

固定38字节

名称占用空间大小描述
FIL_PAGE_SPACE_OR_CHKSUM4字节页的校验和(checksum值)
FIL_PAGE_OFFSET4字节页号
FIL_PAGE_PREV4字节上一个页的页号
FIL_PAGE_NEXT4字节下一个页的页号
FIL_PAGE_LSN8字节页面被最后修改时对应的日志序列位置(英文名是:Log Sequence Number)
FIL_PAGE_TYPE2字节该页的类型
FIL_PAGE_FILE_FLUSH_LSN8字节仅在系统表空间的一个页中定义,代表文件至少被刷新到了对应的LSN值
FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID4字节页属于哪个表空间

其他类型的页

类型名称十六进制描述
FIL_PAGE_TYPE_ALLOCATED0x0000最新分配,还没使用
FIL_PAGE_UNDO_LOG0x0002Undo日志页
FIL_PAGE_INODE0x0003段信息节点
FIL_PAGE_IBUF_FREE_LIST0x0004Insert Buffer空闲列表
FIL_PAGE_IBUF_BITMAP0x0005Insert Buffer位图
FIL_PAGE_TYPE_SYS0x0006系统页
FIL_PAGE_TYPE_TRX_SYS0x0007事务系统数据
FIL_PAGE_TYPE_FSP_HDR0x0008表空间头部信息
FIL_PAGE_TYPE_XDES0x0009扩展描述页
FIL_PAGE_TYPE_BLOB0x000ABLOB页
FIL_PAGE_INDEX0x45BF索引页,也就是我们所说的数据页

页之间通过一个双向链表串起来的。

文件尾部

该部分由8字节组成,是为了检查页是否完整。

  • 4字节的校验和,和文件头的校验和进行比较,若不同则刷新期间发生错误
  • 4字节的LSN
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值