InnoDB页面压缩
InnoDB
支持驻留在每个表文件表空间中的表的页面级压缩。此功能称为透明页面压缩。通过COMPRESSION
使用CREATE TABLE
或指定属性来启用页面压缩ALTER TABLE
。支持的压缩算法包括Zlib
和LZ4
。
支持平台
页面压缩需要稀疏文件和打孔支持。Windows带有NTFS以及以下MySQL支持的Linux平台的子集(其中内核级别提供打孔支持)支持页面压缩:
- 使用内核版本3.10.0-123或更高版本的RHEL 7和派生发行版
- OEL 5.10(UEK2)内核2.6.39或更高版本
- OEL 6.5(UEK3)内核版本3.8.13或更高版本
- OEL 7.0内核版本3.8.13或更高版本
- SLE11内核版本3.0-x
- SLE12内核版本3.12-x
- OES11内核版本3.0-x
- Ubuntu 14.0.4 LTS内核版本3.13或更高版本
- Ubuntu 12.0.4 LTS内核版本3.2或更高版本
- Debian 7内核3.2或更高版本
注意给定Linux发行版的所有可用文件系统可能不支持打孔。
页面压缩如何工作
写入页面时,将使用指定的压缩算法对其进行压缩。压缩后的数据被写入磁盘,其中打孔机制从页面末尾释放空块。如果压缩失败,则按原样写出数据。
Linux上的打孔尺寸
在Linux系统上,文件系统块大小是用于打孔的单位大小。因此,仅当页面数据可以压缩到小于或等于InnoDB
页面大小减去文件系统块大小的大小时,页面压缩才起作用。例如,如果innodb_page_size=16K
文件系统块大小为4K,则页面数据必须压缩到小于或等于12K才能打孔。
Windows上的打孔尺寸
在Windows系统上,稀疏文件的基础结构基于NTFS压缩。打孔大小是NTFS压缩单位,是NTFS群集大小的16倍。下表显示了群集大小及其压缩单位:
Windows NTFS群集大小和压缩单位
簇的大小 | 压缩单元 |
---|---|
512字节 | 8 KB |
1 KB | 16 KB |
2 KB | 32 KB |
4 KB | 64 KB |
仅当页面数据可以压缩到小于或等于InnoDB
页面大小减去压缩单位大小的大小时,Windows系统上的页面压缩才有效。
默认的NTFS群集大小为4KB,其压缩单位大小为64KB。这意味着页面压缩对于现成的Windows NTFS配置没有任何好处,因为最大配置innodb_page_size
也是64KB。
为了使页面压缩在Windows上正常运行,必须以小于4K的群集大小创建文件系统,并且文件系统innodb_page_size
的大小至少应为压缩单位的两倍。例如,要使页面压缩在Windows上运行,您可以使用512字节的群集大小(压缩单位为8KB)构建文件系统,并InnoDB
使用innodb_page_size
16K或更大的值进行初始化。
启用页面压缩
要启用页面压缩,请COMPRESSION
在CREATE TABLE
语句中指定属性。例如:
CREATE TABLE t1 (c1 INT)COMPRESSION ="zlib";
您还可以在ALTER TABLE
语句中启用页面压缩。但是,ALTER TABLE ... COMPRESSION
仅更新表空间压缩属性。使用新设置写入设置了新压缩算法后发生的表空间,但是要将新压缩算法应用于现有页面,必须使用重建表OPTIMIZE TABLE
。
ALTER TABLE t1COMPRESSION ="zlib";OPTIMIZE TABLE t1;
禁用页面压缩
要禁用页面压缩,请COMPRESSION=None
使用设置ALTER TABLE
。写入设置后COMPRESSION=None
不再使用页面压缩的表空间。要解压缩现有页面,必须在OPTIMIZE TABLE
after之后使用重建表COMPRESSION=None
。
ALTER TABLE t1COMPRESSION ="None";OPTIMIZE TABLE t1;
页面压缩元数据
在INFORMATION_SCHEMA.INNODB_TABLESPACES
表的以下列中找到页面压缩元数据:
FS_BLOCK_SIZE
:文件系统块大小,即用于打孔的单位大小。FILE_SIZE
:文件的视在大小,代表未压缩的文件的最大大小。ALLOCATED_SIZE
:文件的实际大小,即磁盘上分配的空间量。
注意在类Unix系统上,以字节为单位显示表观文件大小(等于)。要参见磁盘上实际分配的空间量(等于),请使用。该选项以字节而不是块为单位打印分配的空间,以便可以将其与输出进行比较。
ls -l tablespace_name.ibd
FILE_SIZE
ALLOCATED_SIZE
du --block-size=1 tablespace_name.ibd
--block-size=1
ls -l
使用
SHOW CREATE TABLE
参见当前页面压缩设置(Zlib
,Lz4
,或None
)。一个表可能包含具有不同压缩设置的页面混合。
在以下示例中,从表中检索了employees表的页面压缩元数据INFORMATION_SCHEMA.INNODB_TABLESPACES
。
# Create the employees table with Zlib page compressionCREATE TABLE employees ( emp_no INT NOT NULL, birth_date DATE NOT NULL, first_name VARCHAR(14) NOT NULL, last_name VARCHAR(16) NOT NULL, gender ENUM ('M','F') NOT NULL, hire_date DATE NOT NULL,PRIMARY KEY (emp_no) )COMPRESSION ="zlib"; # Insert data (not shown) # Query page compression metadata in INFORMATION_SCHEMA.INNODB_TABLESPACES mysql>SELECT SPACE,NAME , FS_BLOCK_SIZE, FILE_SIZE, ALLOCATED_SIZEFROM INFORMATION_SCHEMA.INNODB_TABLESPACESWHERE NAME ='employees/employees'\G *************************** 1. row *************************** SPACE : 45 NAME : employees/employees FS_BLOCK_SIZE : 4096 FILE_SIZE : 23068672 ALLOCATED_SIZE : 19415040
员工表的页面压缩元数据显示表观文件大小为23068672字节,而实际文件大小(带页面压缩)为19415040字节。文件系统块大小为4096字节,这是用于打孔的块大小。
使用页面压缩识别表
要标识启用了页面压缩的表,您可以查询该列中使用属性定义的表:INFORMATION_SCHEMA.TABLES
CREATE_OPTIONS
COMPRESSION
mysql>SELECT TABLE_NAME , TABLE_SCHEMA, CREATE_OPTIONSFROM INFORMATION_SCHEMA.TABLES WHERE CREATE_OPTIONS LIKE '%COMPRESSION=%'; +------------ +-------------- +-------------------- + | TABLE_NAME | TABLE_SCHEMA | CREATE_OPTIONS | +------------ +-------------- +-------------------- + | employees | test | COMPRESSION="zlib" | +------------ +-------------- +-------------------- +
SHOW CREATE TABLE
COMPRESSION
如果使用,还显示该属性。
页面压缩限制和使用说明
- 如果文件系统块大小(或Windows上的压缩单位大小)* 2>,则禁用页面压缩
innodb_page_size
。 - 驻留在共享表空间中的表不支持页面压缩,共享表空间包括系统表空间,临时表空间和常规表空间。
- 撤消日志表空间不支持页面压缩。
- 重做日志页面不支持页面压缩。
- 用于空间索引的R树页面未压缩。
- 属于压缩表(
ROW_FORMAT=COMPRESSED
)的页面保持不变。 - 在恢复过程中,更新后的页面以未压缩的形式写出。
- 在不支持所用压缩算法的服务器上加载页面压缩表空间会导致I / O错误。
- 在降级到不支持页面压缩的MySQL的早期版本之前,请解压缩使用页面压缩功能的表。要解压缩表,请运行
ALTER TABLE ... COMPRESSION=None
和OPTIMIZE TABLE
。 - 如果使用的压缩算法在两台服务器上都可用,则可以在Linux和Windows服务器之间复制页面压缩表空间。
- 将页面压缩的表空间文件从一台主机移动到另一台主机时,要保留页面压缩,需要一个实用程序来保留稀疏文件。
- 具有NVMFS的Fusion-io硬件上的页面压缩比其他平台上可以实现更好的页面压缩,因为NVMFS旨在利用打孔功能。
- 使用具有大
InnoDB
页面大小和相对较小文件系统块大小的页面压缩功能可能会导致写入放大。例如,InnoDB
具有4KB文件系统块大小的最大页面大小为64KB可能会改善压缩效果,但也可能会增加对缓冲池的需求,从而导致I / O增加和潜在的写入放大。