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

除了上述描述信息外,其他部分的数据结构和XDES PAGE(FIL_PAGE_TYPE_XDES)都是相同的,使用连续数组的方式,每个XDES PAGE最多存储256个XDES Entry,每个Entry占用40个字节,描述64个Page(即一个Extent)。格式如下:

MacrobytesDesc
XDES_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的四种不同状态:

MacroDesc
XDES_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信息。

MacrobitsDesc
IBUF_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介绍

INODE PAGE

数据文件的第3个page的类型为FIL_PAGE_INODE,用于管理数据文件中的segement,每个索引占用2个segment,分别用于管理叶子节点和非叶子节点。每个inode页可以存储FSP_SEG_INODES_PER_PAGE(默认为85)个记录。

MacrobitsDesc
FSEG_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的结构如下表所示:

MacrobitsDesc
FSEG_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个记录项  
文件维护

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

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