FLST_BASE_NODE:
MacrobytesDescFLST_LEN 4 存储链表的长度
FLST_FIRST 6 指向链表的第一个节点
FLST_LAST 6 指向链表的最后一个节点
FLST_NODE:
MacrobytesDescFLST_PREV 6 指向当前节点的前一个节点
FLST_NEXT 6 指向当前节点的下一个节点
如上所述,文件链表中使用6个字节来作为节点指针,指针的内容包括:
MacrobytesDescFIL_ADDR_PAGE 4 Page No
FIL_ADDR_BYTE 2 Page内的偏移量
该链表结构是InnoDB表空间内管理所有page的基础结构,下图先感受下,具体的内容可以继续往下阅读。
InnoDB 表空间page管理
文件链表管理的相关代码参阅:include/fut0lst.ic, fut/fut0lst.cc
FSP_HDR PAGE数据文件的第一个Page类型为FIL_PAGE_TYPE_FSP_HDR,在创建一个新的表空间时进行初始化(fsp_header_init),该page同时用于跟踪随后的256个Extent(约256MB文件大小)的空间管理,所以每隔256MB就要创建一个类似的数据页,类型为FIL_PAGE_TYPE_XDES ,XDES Page除了文件头部外,其他都和FSP_HDR页具有相同的数据结构,可以称之为Extent描述页,每个Extent占用40个字节,一个XDES Page最多描述256个Extent。
FSP_HDR页的头部使用FSP_HEADER_SIZE个字节来记录文件的相关信息,具体的包括:
MacrobytesDescFSP_SPACE_ID 4 该文件对应的space id
FSP_NOT_USED 4 如其名,保留字节,当前未使用
FSP_SIZE 4 当前表空间总的PAGE个数,扩展文件时需要更新该值(fsp_try_extend_data_file_with_pages)
FSP_FREE_LIMIT 4 当前尚未初始化的最小Page No。从该Page往后的都尚未加入到表空间的FREE LIST上。
FSP_SPACE_FLAGS 4 当前表空间的FLAG信息,见下文
FSP_FRAG_N_USED 4 FSP_FREE_FRAG链表上已被使用的Page数,用于快速计算该链表上可用空闲Page数
FSP_FREE 16 当一个Extent中所有page都未被使用时,放到该链表上,可以用于随后的分配
FSP_FREE_FRAG 16 FREE_FRAG链表的Base Node,通常这样的Extent中的Page可能归属于不同的segment,用于segment frag array page的分配(见下文)
FSP_FULL_FRAG 16 Extent中所有的page都被使用掉时,会放到该链表上,当有Page从该Extent释放时,则移回FREE_FRAG链表
FSP_SEG_ID 8 当前文件中最大Segment ID + 1,用于段分配时的seg id计数器
FSP_SEG_INODES_FULL 16 已被完全用满的Inode Page链表
FSP_SEG_INODES_FREE 16 至少存在一个空闲Inode Entry的Inode Page被放到该链表上
在文件头使用FLAG(对应上述FSP_SPACE_FLAGS)描述了创建表时的如下关键信息:
MacroDescFSP_FLAGS_POS_ZIP_SSIZE 压缩页的block size,如果为0表示非压缩表
FSP_FLAGS_POS_ATOMIC_BLOBS 使用的是compressed或者dynamic的行格式
FSP_FLAGS_POS_PAGE_SSIZE Page Size
FSP_FLAGS_POS_DATA_DIR 如果该表空间显式指定了data_dir,则设置该flag
FSP_FLAGS_POS_SHARED 是否是共享的表空间,如5.7引入的General Tablespace,可以在一个表空间中创建多个表
FSP_FLAGS_POS_TEMPORARY 是否是临时表空间
FSP_FLAGS_POS_ENCRYPTION 是否是加密的表空间,MySQL 5.7.11引入
FSP_FLAGS_POS_UNUSED 未使用的位