mysql 5.7 Transparent PageIO Compression原理及优缺点讲解
原理
innodb的透明页IO压缩,利用punch hole和数据压缩来实现。在内存中是一个正常的页,只有在写到磁盘时,才进行压缩。调用函数os_file_io_complete进行punch hole操作,os_file_io_complete调用的是fallocate()操作系统函数,并且使用 FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE标签,回收磁盘上页的空闲block。具体方法是先将压缩后的内容写入到磁盘,此时磁盘上页仍然是16K,写完成后,调用fallocate函数回收磁盘页中空闲的block,该block以系统block_size为单位。
优点
1、内存中方便管理,只有正常页,不存在压缩后的页
2、更加简单灵活的使用压缩算法
3、代码上可以针对各种类型的页进行压缩
缺点
引用淘宝数据库内核月报中内容:
无法完美压缩:例如9KB的数据可能需要12kb来存储,取决于block size;
无法压缩Buffer pool, 这是和传统innodb压缩相比,以前的压缩方式可以在内存中只存放压缩页拷贝 (然而也有可能同时存在压缩和解压页),因此用户可能需要去购买iops更高的设备,而oracle正好也卖这些….
punch hole 可能产生的文件碎片化,底层的文件管理更加复杂;
对innodb文件做punch hole可能带来的后果是,使得每个文件的page变成一个独立的segment,文件系统需要单独的journal和metadata来管理。另外也有可能有性能问题:可能比non-sparse的写操作昂贵五倍 (这依赖于具体的内核);
删除一个拥有几百万个段管理对象的数据文件带来的开销会非常昂贵。mariadbmysql的innodb中仅支持2种压缩算法,而mariadb的XTRADB中可支持zlib、lz4、lzo、lzma、bzip2、snappy等5种算法。除了,zlib、lz4外,其他的需要下载代码进行编译安装。