MySQL Page Compression
table compress
MySQL在5.1的INNODB中引入了压缩功能,通过压缩功能,能够更加充分的使用硬件,减少IO压力。早期引入的table compress默认采用zlib的压缩算法,针对page数据页进行压缩,可以指定压缩块大小。开启表压缩需要启用innodb_file_per_table独立表空间参数,innodb_file_format需要为Barracuda。
开启表压缩,并指定页大小为8K
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查询压缩比例
mysql> select * from information_schema.INNODB_CMP; |
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选项即可
ALTER TABLE salaries COMPRESSION "zlib"; |
启用transparent page compression压缩后,可以通过information_schema.INNODB_SYS_TABLESPACES来查看一些信息
mysql> select * from information_schema.INNODB_SYS_TABLESPACES where name='employees/salaries'; |
- FS_BLOCK_SIZE是文件系统块大小
- FILE_SIZE是文件逻辑大小,也就是ls查看的结果
- ALLOCATED_SIZE是文件系统所在的块设备实际分配的大小