InnoDB数据页结构
Posted hangzhi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了InnoDB数据页结构相关的知识,希望对你有一定的参考价值。
定义
InnoDB管理存储空间的基本单位,一个页一般是16kb。InnoDB有多种类型的页用于存储不同信息。我们以记录为单位将数据存储在表中,所以存放记录的页又称数据页。数据页是一个双链表记录记录上下页信息。
数据页结构
-
file header文件头部(38byte):描述页的基本信息,比如页号,页类型,上页下页信息(促使数据页组成双链表结构)。
-
page header页面头部(56byte):存储数据页中存储记录的状态值,比如页目录中槽数量,本页的记录数量等
-
Infimum + supremum最小大记录(26byte)
-
user records用户数据(unkown):存储记录。为更好的管理记录,InnoDB以指定的行格式(分析见下方)存储记录
-
free space 空闲空间(unkown):每次插入记录都会从free space申请一个记录大小的空间到user records,如果用完就申请新的页
-
page directory页文件(unkown):为提高根据主键查询记录的效率,InnoDB模仿书本目录,设计了页目录,并以二分法的方式查找;
- 将所有记录(包括最大最小,不包括已删除)划分为几个组
- 每个组的最后一条记录(也就是组内最大的那条记录)的头信息中的
n_owned
属性表示该记录拥有多少条记录,也就是该组内共有几条记录 - 将每个组的最后一条记录的地址偏移量单独提取出来按顺序存储到靠近
页
的尾部的地方,这个地方就是所谓的Page Directory
,也就是页目录
(此时应该返回头看看页面各个部分的图)。页面目录中的这些地址偏移量被称为槽
(英文名:Slot
),所以这个页面目录就是由槽
组成的。 - 最小记录所在组只能有1条记录,最大记录所在组有1-8条,其他4-8条。
- 二分法确定目标记录所在槽,找到该槽中主键最小的那条记录
- 通过记录的next record遍历该槽所在的组中的各个记录
-
file tailer文件尾部(8byte):用于校验页是否完整,如果在写入磁盘事,系统断电,可记录终止的位置。前4byte:记录页的校验和;后4byte:页面最后被修改时对应的日志序列位置LSN
行格式
有四种类型compact等,以compact为例,如下图所示
记录头信息
- delete mask删除标志位(1bit):0否1是,被删除的记录实际仍存在页中,但删除标志位置1,且形成一个被删除记录的垃圾链表,以备之后重用这部分的存储空间。如果删除后还想再次将记录插入到表中,InnoDB会直接复用原来被删除记录的存储空间,并不会重新申请新的存储空间
- min_rec_mask:b+树的每层非叶子节点中的最小记录标志位
- n_owned:
- heap_no:表示记录在页中的位置;0,1表示最小和最大记录,这两个记录每个页自动加入的,是伪记录,不存放在user records而是Infimum + Supremum部分
- record type当前记录类型:0普通记录,1b+树非叶节点记录,2最小记录,3最大记录
- next record:表示从当前记录的真实数据到下一个记录的真实数据的偏移量,形成一个单链表;这里的下一个记录不是插入顺序的下一条记录,而是按照主键由小到大的顺序的下一条记录。如果删除某一条记录,不光将delete mask置为1,并将next record值置为0,将next record指向它的记录指向它的下一条记录
小结
InnoDB
数据页的7个组成部分,知道了各个数据页可以组成一个双向链表
,而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表
,每个数据页都会为存储在它里边儿的记录生成一个页目录
,在通过主键查找某条记录的时候可以在页目录
中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录
注:来自mysql是怎样运行的读书笔记
以上是关于InnoDB数据页结构的主要内容,如果未能解决你的问题,请参考以下文章