MySQL 引擎特性 InnoDB 文件系统之文件物理结构(7)

Index Header
紧随FIL_PAGE_DATA之后的是索引信息,这部分信息是索引页独有的。

MacrobytesDesc
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都是未使用的。

MacrobytesDesc
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信息包括:

MacrobytesDesc
FSEG_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)

MacrobytesDesc
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的系统记录存储方式为:

MacrobytesDesc
REC_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  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/92d804ea01a22ee9e899ff74b884f3f1.html