MySQL是怎样运行的读书笔记2

第五章 InnoDB数据的页解构

页是InnoDB管理存储空间的基本单位,默认情况下,一个页16KB。

页的解构

File Header 38Byte

PageHeader 56Byte

Infimum+Supremum 26Byte

User Records

Free Space

Page Directory

File Trailer 8Byte

本章主要讲了数据页(索引页)

FileHeader

数据页的FileHeader主要描述了页数据的校验和、页号、上下页的页号、页类型等等,算是页级别的大索引。

PageHeader

记录了页内容的元数据。包括Slot数量、未使用的空间最小地址、记录类型及记录数量、待删除链表的头节点偏移量、已删除占用空间字节数、最后插入记录的位置、页中记录条目数、B+树相关内容等信息。

Infimum+Supremum

每个页中两条虚拟的、标识最小记录和最大记录的条目。

UserRecord

每条用户记录都有记录头信息,第三位开始有用,第三位标识记录是否已删除,min_rec_flag是和B+树相关记录,标识是否为非叶子节点的最小目录项。

n_ownerd标识是否是某个组的带头大哥,4bit,并且记录了这个组中有几条数据,这个信息会用于后续Page Directory中,heap_no表示了记录在页堆中的相对位置(排号)13bit,record_type表示了记录类型,

next_record,记录了下一条记录的相对位置,页内链表结构形成的关键元素,next_record指向的下一条记录位置是下一条记录的数据位置,跳过了记录header。一个页中,数据总是开始于Infimum记录,结束语Supremum记录,通过next_record串联起来。

Page Directory 页目录

1、将所有正常记录(包括Infimum和Supremum),不包括已删除的,划分为几个组。
2、每个组最后一条记录,当带头大哥,带头大哥头信息中的的n_ownerd表示组内有几条记录。
3、每个组最后一条记录在页中的地址偏移量(真实数据开始的地址偏移量)提取出来,从页尾开始往前从小到大存储,这些偏移量称为Slot(槽),每个槽占用2字节。槽对应的记录越小,位置越靠近野味。

分组对条数的规定:

1、Infimum记录所在的分组只能有1条记录

2、Supremum记录所在分组的记录数只能在1-8之间,剩下的分组中记录的条数范围在4-8之间。

新增条目操作:

1、初始下,有Infimum和Supremum条数据,分别在两个组。

2、插入数据,找页中已经存在的记录主键值比插入记录大并且差值最小的(刚刚比要插入数据大的,Supremum是页中最大的)组插入,并更新组带头大哥的n_owned+1;

3、当一个组中的记录等于8后,再插入一条数据,会分成两个组,其中一个组4条、一个5条,新增一个槽。

查询方式

很像跳表,从Page Directory中进行二分查找,确定分组后,带入值进行匹配。

File Trailer 文件尾部

很有意思的设计。前4字节存了校验和,与File Header中的校验和相对应,一个在头一个在尾,避免写到一半挂了的情况。后4字节掉膘最后修改时对应的LSN的后4字节,正常情况页应该与Header中的FIL_PAGE_LSN相同。双重校验。

我的微信公众号
我的公众号