FIL Trailer
在每个文件页的末尾保留了8个字节(FIL_PAGE_DATA_END or FIL_PAGE_END_LSN_OLD_CHKSUM),其中4个字节用于存储page checksum,这个值需要和page头部记录的checksum相匹配,否则认为page损坏(buf_page_is_corrupted)
InnoDB当前存在两种形式的压缩页,一种是Transparent Page Compression,还有一种是传统的压缩方式,下文分别进行阐述。
Transparent Page Compression这是MySQL5.7新加的一种数据压缩方式,其原理是利用内核Punch hole特性,对于一个16kb的数据页,在写文件之前,除了Page头之外,其他部分进行压缩,压缩后留白的地方使用punch hole进行 “打洞”,在磁盘上表现为不占用空间 (但会产生大量的磁盘碎片)。 这种方式相比传统的压缩方式具有更好的压缩比,实现逻辑也更加简单。
对于这种压缩方式引入了新的类型FIL_PAGE_COMPRESSED,在存储格式上略有不同,主要表现在从FIL_PAGE_FILE_FLUSH_LSN开始的8个字节被用作记录压缩信息:
MacrobytesDescFIL_PAGE_VERSION 1 版本,目前为1
FIL_PAGE_ALGORITHM_V1 1 使用的压缩算法
FIL_PAGE_ORIGINAL_TYPE_V1 2 压缩前的Page类型,解压后需要恢复回去
FIL_PAGE_ORIGINAL_SIZE_V1 2 未压缩时去除FIL_PAGE_DATA后的数据长度
FIL_PAGE_COMPRESS_SIZE_V1 2 压缩后的长度
打洞后的page其实际存储空间需要是磁盘的block size的整数倍。
这里我们不展开阐述,具体参阅我之前写的这篇文章:MySQL · 社区动态 · InnoDB Page Compression
传统压缩存储格式当你创建或修改表,指定row_format=compressed key_block_size=1|2|4|8 时,创建的ibd文件将以对应的block size进行划分。例如key_block_size设置为4时,对应block size为4kb。
压缩页的格式可以描述如下表所示:
MacroDescFIL_PAGE_HEADER 页面头数据,不做压缩
Index Field Information 索引的列信息,参阅函数page_zip_fields_encode及page_zip_fields_decode,在崩溃恢复时可以据此恢复出索引信息
Compressed Data 压缩数据,按照heap no排序进入压缩流,压缩数据不包含系统列(trx_id, roll_ptr)或外部存储页指针
Modification Log(mlog) 压缩页修改日志
Free Space 空闲空间
External_Ptr (optional) 存在外部存储页的列记录指针数组,只存在聚集索引叶子节点,每个数组元素占20个字节(BTR_EXTERN_FIELD_REF_SIZE),参阅函数page_zip_compress_clust_ext
Trx_id, Roll_Ptr(optional) 只存在于聚集索引叶子节点,数组元素和其heap no一一对应
Node_Ptr 只存在于索引非叶子节点,存储节点指针数组,每个元素占用4字节(REC_NODE_PTR_SIZE)
Dense Page Directory 分两部分,第一部分是有效记录,记录其在解压页中的偏移位置,n_owned和delete标记信息,按照键值顺序;第二部分是空闲记录;每个slot占两个字节。
在内存中通常存在压缩页和解压页两份数据。当对数据进行修改时,通常先修改解压页,再将DML操作以一种特殊日志的格式记入压缩页的mlog中。以减少被修改过程中重压缩的次数。主要包含这几种操作:
Insert: 向mlog中写入完整记录
Update:
Delete-insert update,将旧记录的dense slot标记为删除,再写入完整新记录
In-place update,直接写入新更新的记录
Delete: 标记对应的dense slot为删除
页压缩参阅函数 page_zip_compress
页解压参阅函数 page_zip_decompress
这里我们将所有非独立的数据页统称为系统数据页,主要存储在ibdata中,如下图所示:
InnoDB 系统数据页
ibdata的三个page和普通的用户表空间一样,都是用于维护和管理文件页。其他Page我们下面一一进行介绍。
FSP_IBUF_HEADER_PAGE_NO
Ibdata的第4个page是Change Buffer的header page,类型为FIL_PAGE_TYPE_SYS,主要用于对ibuf btree的Page管理。