MySQL学习笔记 002:InnoDB数据页结构
1 数据页结构
名称 | 大小 (Byte) | 描述 |
---|---|---|
File Header | 38 | 文件头部,存放页通用信息 |
Page Header | 56 | 页头部,存放数据页专用信息 |
Infimum + Supremum | 26 | 首、末虚拟记录 |
User Record | - | 存放记录 |
Page Directory | - | 页目录,存放记录的相对位置 |
File Trailer | 8 | 文件尾部,数据校验 |
2 User Record
2.1 heap_no
记录按顺序排列在User Record中,直至将页内空余空间用完。保存记录的结构称为堆,每条记录中记录头的heap_no递增。Infimum为首条记录,heap_no为0。Supremum为末记录,heap_no为1。用户的记录heap_no从2开始。
2.2 next_record
next_record到下一个记录的真实数据距离。
2.3 deleted_flag
被删除的记录删除后deleted_flag置为1,被删除的记录组成垃圾链表,组成可重用空间。
2.4 record_type
- 0:普通记录
- 1:B+树目录项
- 2:Infimum记录
- 3:Supremum记录
3 Page Directory
记录被分为若干个组,每组最多8条记录。每组最后一条记录的数据的地址偏移量存放在页目录(Page Directory)中。每个组中最后一条记录的n_owned存放组内记录条数。
根据主键查找时,采用二分查找的方式查找记录,减少查找次数。
4 Page Header
名称 | 大小 (Byte) | 描述 |
---|---|---|
page_n_dir_slots | 2 | 页目录中槽的数量 |
page_heap_top | 2 | 未使用空间的最小地址 |
page_n_heap | 2 | 堆内记录数量(包括所有记录) |
page_free | 2 | 垃圾链表头节点 |
page_garbage | 2 | 已删除记录占用字节数 |
page_last_insert | 2 | 最后插入记录地址 |
page_direction | 2 | 记录插入方向 |
page_n_direction | 2 | 一个方向连续插入记录数量 |
page_n_recs | 2 | 页内用户记录数量(不包括已删除记录和首末虚拟记录) |
page_max_trx_id | 8 | 修改当前页的最大事务ID |
page_level | 2 | B+树层级 |
page_index_id | 8 | 索引ID |
page_btr_seg_leaf | 10 | B+树叶子节点段的头部信息 |
page_btr_seg_top | 10 | B+树非叶子节点段的头部信息 |
5 File header & File trailer
5.1 File header
FIL_PAGE_SPACE_OR_CHECKSUM:校验和
FIL_PAGE_OFFSET:页号
FIL_PAGE_PREV:前一页页号(组成双向链表)
FIL_PAGE_NEXT:后一页页号(组成双向链表)
5.2 File trailer
保存校验和和LSN号。