压缩表可以在独立表空间或通用表空间中创建。表压缩不适用于 InnoDB系统表空间。系统表空间可以包含用户创建的表,但同时也包含不能压缩的内部系统数据。因此,压缩仅适用于存储在独立表空间或通用表空间中的表(和索引)。
在独立表空间中创建压缩表
要在独立表空间中创建压缩表, 必须启用innodb_file_per_table(默认)。您可以在 MySQL 配置文件中设置此参数,也可以使用 SET 语句动态设置。
配置innodb_file_per_table选项后,在CREATE TABLE或ALTER TABLE语句中指定 ROW_FORMAT=COMPRESSED子句或 KEY_BLOCK_SIZE子句,以在独立表空间中创建压缩表。
例如,您可以使用以下语句:
SET GLOBAL innodb_file_per_table=1;
CREATE TABLE t1
(c1 INT PRIMARY KEY)
ROW_FORMAT=COMPRESSED
KEY_BLOCK_SIZE=8;
在通用表空间中创建压缩表
要在通用表空间中创建压缩表, 必须为通用表空间定义FILE_BLOCK_SIZE,这是在创建表空间时指定的。FILE_BLOCK_SIZE值必须是与该值相关的有效压缩页面大小。
以下示例演示了创建通用表空间和添加压缩表。该示例假定默认 innodb_page_size值为 16K。8192的FILE_BLOCK_SIZE要求压缩表的KEY_BLOCK_SIZE为 8。
mysql> CREATE TABLESPACE `ts2` ADD DATAFILE 'ts2.ibd' FILE_BLOCK_SIZE = 8192 Engine=InnoDB;
mysql> CREATE TABLE t4 (c1 INT PRIMARY KEY) TABLESPACE ts2 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
注意点
1、从 MySQL 8.0 开始,压缩表的表空间文件是使用物理页面大小而不是InnoDB页面大小创建的,这使得空压缩表的表空间文件的初始大小比以前的 MySQL 版本小。
2、如果指定ROW_FORMAT=COMPRESSED,可以省略KEY_BLOCK_SIZE;该KEY_BLOCK_SIZE设置默认为innodb_page_size值的一半。
3、如果指定有效KEY_BLOCK_SIZE值 ,则可以省略 ROW_FORMAT=COMPRESSED; 压缩是自动启用的。
4、要确定最佳KEY_BLOCK_SIZE值,通常您会为此子句创建具有不同值的同一张表的多个副本,然后测量结果.ibd文件的大小并查看每个副本在实际工作负载下的执行情况。对于通用表空间,请记住删除表不会减小通用表空间.ibd文件的大小,也不会将磁盘空间返回给操作系统。
5、KEY_BLOCK_SIZE值只是被视为提示;如有必要,InnoDB可能使用不同的空间大小 。对于独立表空间,KEY_BLOCK_SIZE只能小于或等于innodb_page_size值。如果您指定的值大于innodb_page_size值,则忽略指定的值,发出警告,并将KEY_BLOCK_SIZE设置为该 innodb_page_size值的一半。如果 innodb_strict_mode=ON,指定无效KEY_BLOCK_SIZE值将返回错误。对于通用表空间,有效值 KEY_BLOCK_SIZE取决于 FILE_BLOCK_SIZE表空间的设置。
6、InnoDB支持 32KB 和 64KB 页面大小,但这些页面大小不支持压缩。
7、InnoDB 数据页的默认未压缩大小为16KB。根据选项值的组合,MySQL为表空间数据文件 ( .ibd文件) 使用 1KB、2KB、4KB、8KB 或 16KB 的页面大小。实际的压缩算法不受KEY_BLOCK_SIZE值的影响;该值决定了每个压缩块有多大,这反过来又会影响可以将多少行打包到每个压缩页面中。
8、在独立表空间中创建压缩表时,设置KEY_BLOCK_SIZE为等于InnoDB 页面大小通常不会导致太多压缩行为。例如,设置 KEY_BLOCK_SIZE=16通常不会导致太多压缩行为,因为正常 InnoDB页面大小为 16KB。此设置对于具有许多BLOB、VARCHAR或TEXT列的表可能仍然有用,因为这些值通常可以很好地压缩,因此可能需要更少的溢出页面。 对于通用表空间,不允许使用KEY_BLOCK_SIZE等于页面大小的值。
9、表的所?有索引(包括聚集索引)都使用相同的页面大小进行压缩,如 CREATE TABLE或ALTER TABLE语句中所指定。诸如 ROW_FORMAT和KEY_BLOCK_SIZE之类的表属性不是InnoDB表CREATE INDEX语法的一部分,如果指定了它们,则将被忽略(尽管它们会出现在SHOW CREATE TABLE语句的输出中)。
压缩表的限制
1、压缩表不能存储在 InnoDB系统表空间中。
2、通用表空间可以包含多个表,但压缩表和未压缩表不能在同一个通用表空间中共存。
3、压缩适用于整个表及其所有关联索引,而不适用于单个行。
4、InnoDB不支持压缩临时表。启用 innodb_strict_mode(默认值)时, 如果指定ROW_FORMAT=COMPRESSED或KEY_BLOCK_SIZE,则CREATE TEMPORARY TABLE语句返回错误 。如果禁用innodb_strict_mode,则会发出警告并使用非压缩行格式创建临时表。同样的限制也适用于临时表的ALTER TABLE操作。