0%

MySQL Page Compression

table compress
MySQL在5.1的INNODB中引入了压缩功能,通过压缩功能,能够更加充分的使用硬件,减少IO压力。早期引入的table compress默认采用zlib的压缩算法,针对page数据页进行压缩,可以指定压缩块大小。开启表压缩需要启用innodb_file_per_table独立表空间参数,innodb_file_format需要为Barracuda。

开启表压缩,并指定页大小为8K

1
mysql> alter table t row_format=compressed,key_block_size=8;

key_block_size则表示压缩块大小,默认为8,我们可以指定16K,4K甚至1K,实际的压缩算法不受KEY_block_size影响,只是指定决定压缩块大小

我们可以通过INFORMATION_SCHEMA.INNODB_CMP查询压缩比例

1
2
3
4
5
6
7
8
9
10
mysql> select * from information_schema.INNODB_CMP;
+-----------+--------------+-----------------+---------------+----------------+-----------------+
| page_size | compress_ops | compress_ops_ok | compress_time | uncompress_ops | uncompress_time |
+-----------+--------------+-----------------+---------------+----------------+-----------------+
| 1024 | 0 | 0 | 0 | 0 | 0 |
| 2048 | 0 | 0 | 0 | 0 | 0 |
| 4096 | 0 | 0 | 0 | 0 | 0 |
| 8192 | 4871 | 3900 | 1 | 0 | 0 |
| 16384 | 0 | 0 | 0 | 0 | 0 |
+-----------+--------------+-----------------+---------------+----------------+-----------------+

compress_ops_ok/compress_ops就是压缩成功率,这里是80%,如果需要更精细的数据可以查看INFORMATION_SCHEMA.INNODB_CMP_PER_INDEX,但需要提前开启innodb_cmp_per_index_enabled。

transparent page compression

在后续版本中新增加了transparent page compression功能,使用该选项时,我们无需指定压缩块大小,它在数据库逻辑中依旧是innodb_page_size指定的page页大小,但其内部可能已经将数据压缩到4K或者8K,其它部分填充特定标识,在进行IO读取时,文件系统能够自动识别只访问实际页数据。

要实现这一点操作系统和文件系统必须支持稀疏文件hole punching。目前linux 2.6.38开始的XFS,linux3.0起的ext4,linux3.5起的tmpfs,linux3.7其的btrfs都能够支持这些功能。

压缩支持两种算法:zlib和lz4。启用压缩只需指定COMPRESSION选项即可

1
ALTER TABLE salaries COMPRESSION "zlib";

启用transparent page compression压缩后,可以通过information_schema.INNODB_SYS_TABLESPACES来查看一些信息

1
2
3
4
5
6
mysql> select * from information_schema.INNODB_SYS_TABLESPACES where name='employees/salaries';
+-------+--------------------+------+-------------+------------+-----------+---------------+------------+---------------+-----------+----------------+
| SPACE | NAME | FLAG | FILE_FORMAT | ROW_FORMAT | PAGE_SIZE | ZIP_PAGE_SIZE | SPACE_TYPE | FS_BLOCK_SIZE | FILE_SIZE | ALLOCATED_SIZE |
+-------+--------------------+------+-------------+------------+-----------+---------------+------------+---------------+-----------+----------------+
| 35 | employees/salaries | 33 | Barracuda | Dynamic | 16384 | 0 | Single | 4096 | 163577856 | 163581952 |
+-------+--------------------+------+-------------+------------+-----------+---------------+------------+---------------+-----------+----------------+
  • FS_BLOCK_SIZE是文件系统块大小
  • FILE_SIZE是文件逻辑大小,也就是ls查看的结果
  • ALLOCATED_SIZE是文件系统所在的块设备实际分配的大小

更多内容请参考:InnoDB Transparent Page Compression