MySQL InnoDB透明页压缩的简单分析

从MySQL 5.7版本开始,MySQL不仅支持原有的压缩表格式(Table Compression),还支持一种称为透明页压缩的特性(Transparent Page Compression)。通过阅资料和源码,我对这个特性有了一定的了解。以下我将从它的使用方法、实现原理等方面对它进行简单分析,并同压缩表格式进行一些对比。

1. 开启方法

官方文档对于透明页压缩的特性的说明仅仅一页,主要说明了它的使用方法,我也对这页官方文档进行过翻译,详见:InnoDB Page Compression MySQL文档翻译:InnoDB透明页压缩

对于透明页压缩的使用方法,和压缩表格式相同的是,都是通过CREATE TABLE或者ALTER TABLE语法对于一个表使用的。不同点是压缩表格式使用ROW_FORMAT=COMPRESSED这个字段,而透明页压缩使用COMPRESSION="zlib"COMPRESSION="lz4"或者COMPRESSION="None"这种字段。分别用两种压缩形式创建一个表的例子:

另外要注意:开启透明页压缩需要文件系统和操作系统支持 Sparse File 和 Hole Punching 特性,并且需要开启InnoDB的file-per-table选项。更详细的使用方法见上边的那篇翻译。

2. 原理简述

2.1. 先说说以前压缩表格式


对于传统的压缩表格式,其在开启时指定了一个压缩后的页的大小。比如上节的例子中指定的8KB。若每次UPDATE或者INSERT操作后都进行压缩,必然太浪费计算时间,所以InnoDB就在每个页中保有一个叫mlog的空闲区域,所有的修改和插入就都被保存这个空闲区域,当mlog快被填满时,页就会被重新压缩,如果8K不再足以存储压缩后的页,那么页就会分裂。

可见传统的压缩表格式的实现,和InnoDB的页面结构有很大的耦合性。此外,innodb buffer pool中可能会同时存在某个页的压缩和未压缩的形式,或者只包含这个页面的压缩形式,或者两者都不包含,其优化细节较为复杂。

2.2. 介绍透明页压缩原理

透明页压缩虽然是最新特性,但是思想却十分简单,我认为其之所以新,也是因为利用了Linux punch hole的新特性[3]。其大概思路就是在压缩时采用了写入文件后进行打洞操作、读入文件后进行解压操作[4]。如下:

框图中的变换和逆变换可以对应加密解密、压缩解压等操作,这里肯定是指的压缩和解压操作了。这种思路简介明了,直接将压缩的工作移动到了文件操作这一层,和页的操作解除了耦合。

当然,这也有缺点,因为读入时就全部解压,写入时全部压缩,所以buffer pool中保有的缓存页都是未压缩的,所以相对于buffer pool中多数为压缩页的“压缩表格式“,可能会需要更大的buffer pool(内存)。

3. 源码简析

  • MySQL 版本: 5.7.17

extra/lz4这个文件夹包含了lz4的库函数,而对于InnoDB的透明页压缩的压缩和解压操作,貌似只用到了LZ4_compress_limitedOutput、LZ4_decompress_safe、LZ4_decompress_fast这三个函数。下面列出调用LZ4函数的函数:

3.1. 压缩操作

以LZ4压缩算法为例:

  • 第一步,调用了LZ4_compress_limitedOutput,LZ4_compress_limitedOutput是LZ4库中LZ4_compress_default函数的直接封装。

  • 第二步,将压缩后数据的大小赋值为文件系统块大小的倍数,方便后续的打洞操作。(比如16KB的数据压缩后为11KB,则把压缩后数据的大小赋值为12KB,并把11KB~12KB的空间全部赋值为空字符)。

在MySQL源码storage/innobase/os/os0file.cc中:

  • 3.2. 打洞(hole punching)操作

在MySQL源码storage/innobase/os/os0file.cc中:

3.3. 解压缩操作

在MySQL源码storage/innobase/os/os0file.cc中:


4. 参考

  1. InnoDB Page Compression MySQL文档翻译:InnoDB透明页压缩, blog.jcix.top, 2017
  2. How Compression Works for InnoDB Tables MySQL文档翻译:InnoDB表压缩工作原理, blog.jcix.top, 2017
  3. Punching holes in files, LWN.net, Jonathan Corbet, November 17, 2010
  4. InnoDB Transparent Page Compression, mysql server team, August 18, 2015
  5. how innodb lost its advantage, Domas Mituzas, 2015/04/09

1 评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注