Index Header
紧随FIL_PAGE_DATA之后的是索引信息,这部分信息是索引页独有的。
PAGE_N_DIR_SLOTS 2 Page directory中的slot个数 (见下文关于Page directory的描述)
PAGE_HEAP_TOP 2 指向当前Page内已使用的空间的末尾便宜位置,即free space的开始位置
PAGE_N_HEAP 2 Page内所有记录个数,包含用户记录,系统记录以及标记删除的记录,同时当第一个bit设置为1时,表示这个page内是以Compact格式存储的
PAGE_FREE 2 指向标记删除的记录链表的第一个记录
PAGE_GARBAGE 2 被删除的记录链表上占用的总的字节数,属于可回收的垃圾碎片空间
PAGE_LAST_INSERT 2 指向最近一次插入的记录偏移量,主要用于优化顺序插入操作
PAGE_DIRECTION 2 用于指示当前记录的插入顺序以及是否正在进行顺序插入,每次插入时,PAGE_LAST_INSERT会和当前记录进行比较,以确认插入方向,据此进行插入优化
PAGE_N_DIRECTION 2 当前以相同方向的顺序插入记录个数
PAGE_N_RECS 2 Page上有效的未被标记删除的用户记录个数
PAGE_MAX_TRX_ID 8 最近一次修改该page记录的事务ID,主要用于辅助判断二级索引记录的可见性。
PAGE_LEVEL 2 该Page所在的btree level,根节点的level最大,叶子节点的level为0
PAGE_INDEX_ID 8 该Page归属的索引ID
Segment Info
随后20个字节描述段信息,仅在Btree的root Page中被设置,其他Page都是未使用的。
PAGE_BTR_SEG_LEAF 10(FSEG_HEADER_SIZE) leaf segment在inode page中的位置
PAGE_BTR_SEG_TOP 10(FSEG_HEADER_SIZE) non-leaf segment在inode page中的位置
10个字节的inode信息包括:
MacrobytesDescFSEG_HDR_SPACE 4 描述该segment的inode page所在的space id (目前的实现来看,感觉有点多余…)
FSEG_HDR_PAGE_NO 4 描述该segment的inode page的page no
FSEG_HDR_OFFSET 2 inode page内的页内偏移量
通过上述信息,我们可以找到对应segment在inode page中的描述项,进而可以操作整个segment。
系统记录
之后是两个系统记录,分别用于描述该page上的极小值和极大值,这里存在两种存储方式,分别对应旧的InnoDB文件系统,及新的文件系统(compact page)
REC_N_OLD_EXTRA_BYTES + 1 7 固定值,见infimum_supremum_redundant的注释
PAGE_OLD_INFIMUM 8 “infimum\0”
REC_N_OLD_EXTRA_BYTES + 1 7 固定值,见infimum_supremum_redundant的注释
PAGE_OLD_SUPREMUM 9 “supremum\0”
Compact的系统记录存储方式为:
MacrobytesDescREC_N_NEW_EXTRA_BYTES 5 固定值,见infimum_supremum_compact的注释
PAGE_NEW_INFIMUM 8 “infimum\0”
REC_N_NEW_EXTRA_BYTES 5 固定值,见infimum_supremum_compact的注释
PAGE_NEW_SUPREMUM 8 “supremum”,这里不带字符0