目录
InnoDB支持对驻留在FPT表空间中的表进行页面级压缩。
此功能被称为透明页面压缩。通过使用CREATE TABLE或ALTER TABLE指定COMPRESSION 属性来启用页面压缩 。支持的压缩算法包括Zlib 和LZ4。
1.支持的平台
页面压缩需要稀疏文件 和打孔支持 。使用NTFS 的Windows 以及以下MySQL支持的Linux平台子集支持页面压缩,其中内核级别提供打孔支持:
RHEL 7和使用内核版本3.10.0-123或更高版本的派生发行版
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发行版的所有可用文件系统可能都不支持打孔。
博主补充:你可以这么理解什么是稀疏文件和打孔,稀疏文件就是有一个程序在写文件时,先申请了一个1GB的空间,但是它只在这1GB的空间的最后的地方写入了几个字节的数据,但是表观看起来这个文件就是有1个GB。就好像我们下载电影,电影还没下完,但是磁盘上已经是显示这个电影的总大小了。这种并没有实际写入实际大小数据的文件你可以称之为稀疏文件。
而打孔技术,就是对这样的文件进行整理,将未写的空间整理出来使用。
如果你是Java开发的话,你可以理解为JVM中垃圾收集时对内存进行的标记整理压缩算法。或者Windows中的磁盘碎片整理。
2.页面压缩的工作原理
写入页面时,会使用指定的压缩算法 对其进行压缩 。压缩后的数据被写入磁盘,打孔机制 从页面末尾 释放空块。如果压缩失败,数据将按原样写入。
Windows NTFS分区大小和压缩单元
分区大小 | 压缩单元 |
---|---|
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的文件系统,innodb_page_size必须至少是压缩单元大小的两倍。
例如,为了在Windows上进行页面压缩,可以构建分区大小为512字节(压缩单位为8KB) 的文件系统,并使用InnoDB_page_size值16K 或更大的值初始化InnoDB。
3.启用页面压缩
要启用页面压缩,请在CREATE TABLE语句中指定COMPRESSION 属性。例如
sql
CREATE TABLE t1 (c1 INT) COMPRESSION="zlib";
您还可以在ALTER TABLE语句中启用页面压缩。但是,ALTER TABLE ... COMPRESSION仅更新表空间压缩属性。
设置新的压缩算法 后发生的对表空间的写入使用新设置 ,但要将新压缩算法应用于现有页面 ,必须使用OPTIMIZE TABLE重新生成表。
sql
ALTER TABLE t1 COMPRESSION="zlib";
OPTIMIZE TABLE t1;
4.禁用页面压缩
若要禁用页面压缩,请使用ALTER TABLE将COMPRESSION 设置为None。
在设置COMPRESSION=None之后发生的对表空间的写入不再使用页面压缩。
若要解压缩现有页面,必须在设置COMPRESSION=None后使用OPTIMIZE TABLE重新生成表。
sql
ALTER TABLE t1 COMPRESSION="None";
OPTIMIZE TABLE t1;
5.页面压缩-元数据
页面压缩元数据位于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)。
一个表可能包含具有不同压缩设置 的页面的混合。
在以下示例中,从Information Schema库INNODB_TABLESPACES表中检索employees表的页面压缩的元数据。
sql
# 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_TABLESPACES
mysql> SELECT SPACE, NAME, FS_BLOCK_SIZE, FILE_SIZE, ALLOCATED_SIZE FROM
INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME='employees/employees'\G
*************************** 1. row ***************************
SPACE: 45
NAME: employees/employees
FS_BLOCK_SIZE: 4096
FILE_SIZE: 23068672
ALLOCATED_SIZE: 19415040
employees表的页面压缩元数据显示,表观文件大小为23068672字节 ,而实际文件大小(使用页面压缩)为19415040字节。文件系统块大小为4096字节,这是用于打孔的块大小。
6.使用页面压缩识别表
要识别启用了页面压缩的表,可以检查Information Schema库的tables表的CREATE_OPTIONS列中是否有使用COMPRESSION 属性定义的表:
sql
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" |
+------------+--------------+--------------------+
SHOW CREATE TABLE还显示COMPRESSION属性(如果使用的话)。
7.页面压缩限制和使用说明
如果文件系统块大小(或Windows上的压缩单元大小)*2 > innodb_Page_size,则禁用页面压缩。
对于驻留在共享表空间(包括系统表空间、临时表空间和通用表空间)中的表,不支持页面压缩。
redolog表空间不支持页面压缩。
undolog日志页不支持页面压缩。
用于空间索引的R树页不会被压缩。
属于压缩表(ROW_FORMAT=COMPRESSED)的页面保持原样。
在恢复过程中,更新的页面会以未压缩的形式写出。
在不支持所使用的压缩算法 的服务器上加载页面压缩表空间会导致I/O错误。
在降级到不支持页面压缩的MySQL早期版本之前,请解压缩使用页面压缩功能的表。若要解压缩表,请运行ALTER TABLE ... COMPRESSION=None 且 OPTIMIZE TABLE.重建表
如果使用的压缩算法在Linux和Windows服务器上都可用,则可以在这两台服务器之间复制页压缩的表空间。
当将页压缩的表空间文件 从一个主机移动到另一个主机时,保留页压缩需要一个保留稀疏文件的实用程序。
与其他平台相比,使用NVMFS 的Fusion io 硬件可以实现更好的页面压缩,因为NVMFS旨在利用打孔功能。
使用具有较大InnoDB页面大小 和相对较小文件系统块大小 的页面压缩功能可能会导致写入放大 。例如,具有4KB文件系统块大小 的64KB的最大InnoDB页面大小 可以提高压缩,但也可能增加对缓冲池的需求 ,从而增加I/O 和潜在的写入放大。
上一篇: