14.9.2 InnoDB 页面压缩
InnoDB
支持驻留在file-per-tabletable 空间中的 table 的页面级压缩。此功能称为透明页面压缩。通过使用CREATE TABLE或ALTER TABLE指定COMPRESSION
属性来启用页面压缩。支持的压缩算法包括Zlib
和LZ4
。
Supported Platforms
页面压缩需要稀疏文件和打孔支持。 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 或更高版本
Note
给定 Linux 发行版的所有可用文件系统可能不支持打孔。
页面压缩的工作方式
写入页面时,将使用指定的压缩算法对其进行压缩。压缩后的数据被写入磁盘,其中打孔机制从页面末尾释放空块。如果压缩失败,则按原样写出数据。
Linux 上的打孔尺寸
在 Linux 系统上,文件系统块大小是用于打孔的单位大小。因此,仅当页面数据可以压缩到小于或等于InnoDB
页面大小减去文件系统块大小的大小时,页面压缩才有效。例如,如果innodb_page_size=16K并且文件系统块大小为 4K,则页面数据必须压缩到小于或等于 12K 才能打孔。
Windows 上的打孔尺寸
在 Windows 系统上,稀疏文件的基础基础结构是基于 NTFS 压缩的。打孔大小是 NTFS 压缩单位,是 NTFS 群集大小的 16 倍。下 table 显示了群集大小及其压缩单位:
table14.8 Windows NTFS 群集大小和压缩单位
Cluster Size | Compression Unit |
---|---|
512 Bytes | 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 的 Cluster 大小创建文件系统,并且innodb_page_size至少应为压缩单元大小的两倍。例如,要使页面压缩在 Windows 上运行,您可以构建具有 512 字节 Cluster 大小(压缩单位为 8KB)的文件系统,并以_值为 16K 或更大的值初始化InnoDB
。
启用页面压缩
要启用页面压缩,请在CREATE TABLE语句中指定COMPRESSION
属性。例如:
CREATE TABLE t1 (c1 INT) COMPRESSION="zlib";
您还可以在ALTER TABLE语句中启用页面压缩。但是,更改 table...压缩仅更新 table 空间压缩属性。设置新的压缩算法后使用新设置写入 table 空间,但是要将新的压缩算法应用于现有页面,必须使用OPTIMIZE TABLE重建 table。
ALTER TABLE t1 COMPRESSION="zlib";
OPTIMIZE TABLE t1;
禁用页面压缩
要禁用页面压缩,请使用ALTER TABLE设置COMPRESSION=None
。写入设置COMPRESSION=None
之后发生的 table 空间不再使用页面压缩。要解压缩现有页面,必须在设置COMPRESSION=None
之后使用OPTIMIZE TABLE重建 table。
ALTER TABLE t1 COMPRESSION="None";
OPTIMIZE TABLE t1;
页面压缩元数据
页面压缩元数据位于INFORMATION_SCHEMA.INNODB_SYS_TABLESPACEStable 的以下列中:
-
FS_BLOCK_SIZE
:文件系统块大小,是用于打孔的单位大小。 -
FILE_SIZE
:文件的视在大小,代 table 未压缩的文件的最大大小。 -
ALLOCATED_SIZE
:文件的实际大小,即磁盘上分配的空间量。
Note
在类似 Unix 的系统上,ls -l tablespace_name.ibd
以字节为单位显示视在文件的大小(相当于FILE_SIZE
)。要查看磁盘上实际分配的空间量(等于ALLOCATED_SIZE
),请使用du --block-size=1 tablespace_name.ibd
。 --block-size=1
选项以字节而不是块为单位打印分配的空间,以便可以将其与ls -l
输出进行比较。
使用显示创建 table查看当前的页面压缩设置(Zlib
,Lz4
或None
)。一个 table 可能包含具有不同压缩设置的页面混合。
在以下示例中,employeestable 的页面压缩元数据从INFORMATION_SCHEMA.INNODB_SYS_TABLESPACEStable 中检索。
# Create the employees table with Zlib page compression
CREATE 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_SYS_TABLESPACES
mysql> SELECT SPACE, NAME, FS_BLOCK_SIZE, FILE_SIZE, ALLOCATED_SIZE FROM
INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES WHERE NAME='employees/employees'\G
*************************** 1. row ***************************
SPACE: 45
NAME: employees/employees
FS_BLOCK_SIZE: 4096
FILE_SIZE: 23068672
ALLOCATED_SIZE: 19415040
员工 table 的页面压缩元数据显示 table 观文件大小为 23068672 字节,而实际文件大小(带页面压缩)为 19415040 字节。文件系统块大小为 4096 字节,这是用于打孔的块大小。
使用页面压缩识别 table
要标识启用了页面压缩的 table,可以在INFORMATION_SCHEMA.TABLES CREATE_OPTIONS
列中查询使用COMPRESSION
属性定义的 table:
mysql> SELECT TABLE_NAME, TABLE_SCHEMA, CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES
WHERE CREATE_OPTIONS LIKE '%COMPRESSION=%';
+------------+--------------+--------------------+
| TABLE_NAME | TABLE_SCHEMA | CREATE_OPTIONS |
+------------+--------------+--------------------+
| employees | test | COMPRESSION="zlib" |
+------------+--------------+--------------------+
显示创建 table也显示COMPRESSION
属性(如果使用)。
页面压缩限制和使用说明
-
如果文件系统块大小(或 Windows 上的压缩单位大小)* 2> innodb_page_size,则禁用页面压缩。
-
驻留在共享 table 空间中的 table 不支持页面压缩,共享 table 空间包括系统 table 空间,临时 table 空间和常规 table 空间。
-
撤消日志 table 空间不支持页面压缩。
-
重做日志页面不支持页面压缩。
-
用于空间索引的 R 树页面未压缩。
-
属于压缩 table(
ROW_FORMAT=COMPRESSED
)的页面保持不变。 -
恢复期间,更新后的页面以未压缩的形式写出。
-
在不支持所用压缩算法的服务器上加载页面压缩 table 空间会导致 I/O 错误。
-
在降级到不支持页面压缩的 MySQL 的早期版本之前,请解压缩使用页面压缩功能的 table。要解压缩 table,请运行ALTER TABLE ... COMPRESSION =无和OPTIMIZE TABLE。
-
如果使用的压缩算法在两台服务器上都可用,则可以在 Linux 和 Windows 服务器之间复制页面压缩的 table 空间。
-
将页面压缩的 table 空间文件从一台主机移动到另一台主机时,要保留页面压缩,需要一个 Util 来保留稀疏文件。
-
使用 NVMFS 的 Fusion-io 硬件比其他平台可以实现更好的页面压缩,因为 NVMFS 旨在利用打孔功能。
-
使用具有大
InnoDB
页大小和相对较小的文件系统块大小的页面压缩功能可能导致写放大。例如,具有 4KB 文件系统块大小的最大InnoDB
页面大小为 64KB,可以改善压缩效果,但也可能增加对缓冲池的需求,从而导致 I/O 增大和潜在的写放大。