InnoDB
中驻留的表支持页级压缩file-per-table表空间。这个特性被称为透明页面压缩.参数来启用页压缩压缩
属性与创建表
或ALTER TABLE
.支持的压缩算法包括Zlib
而且LZ4
.
支持的平台上
页面压缩需要稀疏文件和孔冲孔支持。在使用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发行版的所有可用文件系统可能都不支持打孔。
页面压缩的工作原理
当写入一个页面时,将使用指定的压缩算法对其进行压缩。压缩后的数据被写入磁盘,在磁盘上穿孔机制从页尾释放空块。如果压缩失败,数据将被原样写入。
Linux上的打孔器大小
在Linux系统上,文件系统块大小是用于打孔的单位大小。因此,只有当页数据可以压缩到小于或等于的大小时,页压缩才有效InnoDB
页面大小减去文件系统块大小。例如,如果innodb_page_size = 16 k
当文件系统块大小为4K时,页面数据必须压缩到小于等于12K,才能使打孔成为可能。
窗户上的打孔器尺寸
在Windows系统上,稀疏文件的底层基础结构基于NTFS压缩。打孔尺寸为NTFS压缩单元,是NTFS簇尺寸的16倍。集群大小及其压缩单位如下表所示:
只有当页数据可以压缩到小于或等于的大小时,Windows系统上的页压缩才有效InnoDB
页面大小减去压缩单元大小。
默认的NTFS集群大小为4KB,压缩单元大小为64KB。这意味着页面压缩对于开箱即用的Windows NTFS配置没有任何好处innodb_page_size
也是64 kb。
要使页面压缩在Windows上工作,必须用小于4K的集群大小创建文件系统innodb_page_size
必须至少是压缩单元大小的两倍。例如,要在Windows上进行页面压缩,可以构建集群大小为512字节(压缩单位为8KB)的文件系统并进行初始化InnoDB
与一个innodb_page_size
16K或更大的值。
使页面压缩
要启用页压缩,请指定压缩
属性创建表
声明。例如:
CREATE TABLE t1 (c1 INT) COMPRESSION="zlib";
控件中还可以启用页压缩ALTER TABLE
声明。然而,ALTER TABLE……压缩
只更新表空间压缩属性。在设置新的压缩算法之后对表空间的写入使用新的设置,但要将新的压缩算法应用于现有页,必须使用重新构建表优化表
.
ALTER TABLE t1 COMPRESSION="zlib";优化表t1;
禁用页面压缩
若要禁用页面压缩,请设置压缩=没有
使用ALTER TABLE
.写入设置后发生的表空间压缩=没有
不再使用页面压缩。要解压缩现有页,必须使用优化表
设置后压缩=没有
.
ALTER TABLE t1 COMPRESSION="None";优化表t1;
页面元数据压缩
页压缩元数据可以在INFORMATION_SCHEMA。INNODB_SYS_TABLESPACES
表,在以下列:
FS_BLOCK_SIZE
:文件系统块大小,即打孔时使用的单位大小。FILE_SIZE
:文件的表观大小,表示未压缩时文件的最大大小。ALLOCATED_SIZE
:文件的实际大小,即磁盘上分配的空间大小。
在类unix系统上,ls - l
显示明显的文件大小(相当于tablespace_name
.ibdFILE_SIZE
在字节。查看磁盘上实际分配的空间量(相当于ALLOCATED_SIZE
),使用栋du - = 1
.的tablespace_name
.ibd——块= 1
选项以字节而不是块的形式打印分配的空间,以便与之进行比较ls - l
输出。
使用显示创建表
要查看当前页面压缩设置(Zlib
,Lz4
,或没有一个
).一个表可以混合包含具有不同压缩设置的页面。
类中检索employees表的页压缩元数据INFORMATION_SCHEMA。INNODB_SYS_TABLESPACES
表格
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,性别ENUM ('M','F') NOT NULL, hire_date DATE NOT NULL, PRIMARY KEY (emp_no)) compression =" Zlib ";#在INFORMATION_SCHEMA中查询页面压缩元数据。INNODB_SYS_TABLESPACESmysql> 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
employees表的页面压缩元数据显示,表观文件大小为23068672字节,而实际文件大小(使用页面压缩)为19415040字节。文件系统块大小为4096字节,这是打孔时使用的块大小。
使用页压缩识别表
为标识启用了页压缩的表,可以查询INFORMATION_SCHEMA。表
CREATE_OPTIONS
类定义的表的压缩
属性:
mysql> SELECT TABLE_NAME, TABLE_SCHEMA, CREATE_OPTIONS FROM INFORMATION_SCHEMA。表中create_options如'% compression =%';+------------+--------------+--------------------+ | TABLE_NAME | TABLE_SCHEMA | CREATE_OPTIONS | +------------+--------------+--------------------+ | 员工测试| | zlib压缩=” " | +------------+--------------+--------------------+
显示创建表
也显示了压缩
属性,如果使用。
页面压缩限制和使用说明
如果文件系统块大小(或Windows上的压缩单元大小)* 2 >,则页面压缩将被禁用
innodb_page_size
.对于位于共享表空间中的表(包括系统表空间、临时表空间和通用表空间),不支持页面压缩。
undo日志表空间不支持页面压缩。
重做日志页不支持页压缩。
用于空间索引的r -树页面没有被压缩。
属于压缩表的页(
ROW_FORMAT =压缩
)都保持原样。在恢复期间,更新的页面将以未压缩的形式写入。
在不支持所使用的压缩算法的服务器上加载页面压缩表空间会导致I/O错误。
在降级到不支持页面压缩的MySQL早期版本之前,请先解压使用页面压缩特性的表。要解压表,运行
ALTER TABLE……压缩=没有
而且优化表
.如果使用的压缩算法在Linux和Windows服务器上都可用,则可以在Linux和Windows服务器之间复制页压缩表空间。
当将页面压缩表空间文件从一个主机移动到另一个主机时,保持页面压缩需要一个保持稀疏文件的实用程序。
在使用NVMFS的Fusion-io硬件上可能比在其他平台上获得更好的页面压缩,因为NVMFS的设计目的是利用冲孔功能。
使用页面压缩功能
InnoDB
页面大小和相对较小的文件系统块大小可能导致写放大。例如,最大值InnoDB
64KB的页面大小和4KB的文件系统块大小可以改善压缩,但也可能增加对缓冲池的需求,导致增加I/O和潜在的写放大。