InnoDB支持在独立表空间中存储表的页级压缩 。此功能称为压缩透明页面。通过使用CREATE TABLE或 ALTER TABLE指定COMPRESSION使用页面压缩的属性。支持的压缩算法包括Zlib和LZ4。
用指定的压缩算法压缩页面。将压缩数据写入磁盘,打孔机制从页面末尾释放空块。若压缩失败,则按原样写数据。
在 Linux 在系统中,文件系统块的大小等于打孔的单位大小。因此,页面压缩只能在页面数据中压缩到小于或等于 InnoDB减去文件系统块大小后,页面大小有效。例如,如果 innodb_page_size=16K文件系统块大小为 4K,页面数据必须压缩到小于或等于 12K 使打孔成为可能。
在 Windows 在系统上,基于稀疏文件的底层基础结构 NTFS 压缩。钻孔大小等于 NTFS 压缩单位,是的 NTFS 簇大小的 16 倍。如下表所示压缩单位如下表所示:
簇的大小 | 压缩单元 |
512 字节 | 8 KB |
1 KB | 16 KB |
2 KB | 32 KB |
4 KB | 64 KB |
Windows 在页面数据中,系统上的页面压缩可以压缩到小于或等于 InnoDB减去压缩单元大小的页面大小有效。
默认 NTFS 簇大小为 4KB,其压缩单元大小为 64KB。
默认 NTFS 簇大小为 4KB,其压缩单元大小为 64KB。这意味着页面压缩用于开箱 Windows NTFS 配置没有好处,因为innodb_page_size最大值也是64KB。
要在 Windows 页面压缩必须小于 4K 集群大小创建文件系统, innodb_page_size至少是压缩单元大小的两倍。例如,要在 Windows 在页面压缩上,可以构建集群大小为 512 字节(压缩单元为 8KB)并使用文件系统 16K 或更大InnoDB的 innodb_page_size初始化值。
使用页面压缩
要使用页面压缩,请在CREATE TABLE语句中指定COMPRESSION属性 。例如:CREATE TABLE t1 (c1 INT) COMPRESSION="zlib";
您还可以在 ALTER TABLE在句子中使用页面压缩。但是, ALTER TABLE ... COMPRESSION只更新表空间压缩属性。设置新的压缩算法后,将表空间写入使用新的设置,但要在现有页面上应用新的压缩算法,必须使用OPTIMIZE TABLE重建表。ALTER TABLE t1 COMPRESSION="zlib";OPTIMIZE TABLE t1;
禁止页面压缩
要禁止页面压缩,请使用 ALTER TABLE并设置COMPRESSION=None。 COMPRESSION=None页面压缩不路由知识再用于设置后对表空间的写入。要解压现有页面,必须使用OPTIMIZE TABLE重建表。ALTER TABLE t1 COMPRESSION="None";OPTIMIZE TABLE t1;
页面压缩元数据
页面压缩元数据可在 INFORMATION_SCHEMA.INNODB_TABLESPACES 在下列表中找到:
1、FS_BLOCK_SIZE:文件系统块的大小,即钻孔时使用的单位大小。
2、FILE_SIZE:文件的大小,表示文件的最大大小,没有压缩。
2、FILE_SIZE:文件的大小,表示文件的最大大小,没有压缩。
从以下示例中 INFORMATION_SCHEMA.INNODB_TABLESPACES表中检索employees 表页压缩元数据 。
# 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_TABLESPACESmysql> SELECT SPACE, NAME, FS_BLOCK_SIZE, FILE_SIZE, ALLOCATED_SIZE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME='employees/employees'\\G*************************** 1. row ***************************SPACE: 45NAME: employees/employeesFS_BLOCK_SIZE: 4096FILE_SIZE: 23068672ALLOCATED_SIZE: 19415040
使用页面压缩识别表要识别页面压缩表,您可以查询INFORMATION_SCHEMA.TABLES中使用COMPRESSION属性定义表列:
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" | ------------ -------------- --------------------
页面压缩限制及使用说明
1.如果文件系统块的大小(或 Windows 上压缩单元大小)* 2 > innodb_page_size,禁止页面压缩。
页面压缩限制及使用说明1.如果文件系统块的大小(或 Windows 上压缩单元大小)* 2 > innodb_page_size,禁止页面压缩。位于共享表空间(包括系统表空间、临时表空间和通用表空间)中的表不支持页面压缩。3.取消日志表空间不支持页面压缩。4.重做日志页面不支持页面压缩。用于空间索引 R-tree 页未压缩。6.属于压缩表 ( ROW_FORMAT=COMPRESSED) 页面保持原样。7.在恢复期间,以未压缩的形式写出更新的页面。在不支持压缩算法的服务器上加载页面压缩表空间会导致页面压缩表空间 I/O 错误。9.早期版本的降级到不支持页面压缩 MySQL 以前,页面压缩功能的表用于解压缩。解压缩表,请操作 ALTER TABLE ... COMPRESSION=None和OPTIMIZE TABLE。10.如果使用的压缩算法可用于两台服务器,则可用于 Linux 和 Windows 复制页面压缩表空间之间的服务器。11.当页压缩表空间文件从一台主机移动到另一台主机时,需要能够支持保留稀疏文件的组件才能保留页压缩。12、在具有 NVMFS 的 Fusion-io 比其他平台上更好的页面压缩可以在硬件上实现,因为 NVMFS 旨在利用打孔功能。13.使用量大 InnoDB页面压缩功能和相对较小的文件系统块可能会导致写入放大。例如, 64KB的InnoDB最大页面大小和4KB文件系统块的大小可能会提高压缩率,但也可能会增加对缓冲池的需求,导致 I/O 增加和放大潜在的写入。