除了上述描述信息外,其他部分的数据结构和XDES PAGE(FIL_PAGE_TYPE_XDES)都是相同的,使用连续数组的方式,每个XDES PAGE最多存储256个XDES Entry,每个Entry占用40个字节,描述64个Page(即一个Extent)。格式如下:
MacrobytesDescXDES_ID 8 如果该Extent归属某个segment的话,则记录其ID
XDES_FLST_NODE 12(FLST_NODE_SIZE) 维持Extent链表的双向指针节点
XDES_STATE 4 该Extent的状态信息,包括:XDES_FREE,XDES_FREE_FRAG,XDES_FULL_FRAG,XDES_FSEG,详解见下文
XDES_BITMAP 16 总共16*8= 128个bit,用2个bit表示Extent中的一个page,一个bit表示该page是否是空闲的(XDES_FREE_BIT),��一个保留位,尚未使用(XDES_CLEAN_BIT)
XDES_STATE表示该Extent的四种不同状态:
MacroDescXDES_FREE(1) 存在于FREE链表上
XDES_FREE_FRAG(2) 存在于FREE_FRAG链表上
XDES_FULL_FRAG(3) 存在于FULL_FRAG链表上
XDES_FSEG(4) 该Extent归属于ID为XDES_ID记录的值的SEGMENT。
通过XDES_STATE信息,我们只需要一个FLIST_NODE节点就可以维护每个Extent的信息,是处于全局表空间的链表上,还是某个btree segment的链表上。
IBUF BITMAP PAGE第2个page类型为FIL_PAGE_IBUF_BITMAP,主要用于跟踪随后的每个page的change buffer信息,使用4个bit来描述每个page的change buffer信息。
MacrobitsDescIBUF_BITMAP_FREE 2 使用2个bit来描述page的空闲空间范围:0(0 bytes)、1(512 bytes)、2(1024 bytes)、3(2048 bytes)
IBUF_BITMAP_BUFFERED 1 是否有ibuf操作缓存
IBUF_BITMAP_IBUF 1 该Page本身是否是Ibuf Btree的节点
由于bitmap page的空间有限,同样每隔256个Extent Page之后,也会在XDES PAGE之后创建一个ibuf bitmap page。
关于change buffer,这里我们不展开讨论,感兴趣的可以阅读之前的这篇月报:
MySQL · 引擎特性 · Innodb change buffer介绍
数据文件的第3个page的类型为FIL_PAGE_INODE,用于管理数据文件中的segement,每个索引占用2个segment,分别用于管理叶子节点和非叶子节点。每个inode页可以存储FSP_SEG_INODES_PER_PAGE(默认为85)个记录。
MacrobitsDescFSEG_INODE_PAGE_NODE 12 INODE页的链表节点,记录前后Inode Page的位置,BaseNode记录在头Page的FSP_SEG_INODES_FULL或者FSP_SEG_INODES_FREE字段。
Inode Entry 0 192 Inode记录
Inode Entry 1
……
Inode Entry 84
每个Inode Entry的结构如下表所示:
MacrobitsDescFSEG_ID 8 该Inode归属的Segment ID,若值为0表示该slot未被使用
FSEG_NOT_FULL_N_USED 8 FSEG_NOT_FULL链表上被使用的Page数量
FSEG_FREE 16 完全没有被使用并分配给该Segment的Extent链表
FSEG_NOT_FULL 16 至少有一个page分配给当前Segment的Extent链表,全部用完时,转移到FSEG_FULL上,全部释放时,则归还给当前表空间FSP_FREE链表
FSEG_FULL 16 分配给当前segment且Page完全使用完的Extent链表
FSEG_MAGIC_N 4 Magic Number
FSEG_FRAG_ARR 0 4 属于该Segment的独立Page。总是先从全局分配独立的Page,当填满32个数组项时,就在每次分配时都分配一个完整的Extent,并在XDES PAGE中将其Segment ID设置为当前值
…… ……
FSEG_FRAG_ARR 31 4 总共存储32个记录项
文件维护