Documentation Home

15.9.1.2 创建压缩表

可以在 file-per-table 表 空间或 通用表空间中创建压缩表。表压缩不适用于 InnoDB系统表空间。系统表空间(空间 0, .ibdata 文件)可以包含用户创建的表,但它也包含从不压缩的内部系统数据。因此,压缩仅适用于存储在 file-per-table 或通用表空间中的表(和索引)。

在 File-Per-Table 表空间中创建压缩表

要在 file-per-table 表空间中创建压缩表, innodb_file_per_table必须启用(默认)。您可以在 MySQL 配置文件中(my.cnfmy.ini)或使用 SET 语句动态设置此参数。

配置该innodb_file_per_table 选项 后,在or 语句中指定ROW_FORMAT=COMPRESSED子句或 KEY_BLOCK_SIZE子句或两者,以 在 file-per-table 表空间中创建压缩表。 CREATE TABLEALTER TABLE

例如,您可以使用以下语句:

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值必须是相对于该值的有效压缩页面大小 ,并且由or 子句innodb_page_size定义的压缩表的页面大小 必须等于 。例如,如果 和 , 表的 必须为 8。有关更多信息,请参阅第 15.6.3.3 节,“常规表空间”CREATE TABLEALTER TABLE KEY_BLOCK_SIZEFILE_BLOCK_SIZE/1024innodb_page_size=16384FILE_BLOCK_SIZE=8192KEY_BLOCK_SIZE

以下示例演示了创建通用表空间和添加压缩表。该示例假定默认 innodb_page_size值为 16K。8192的 FILE_BLOCK_SIZE要求压缩表的 aKEY_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;
笔记
  • 从 MySQL 8.0 开始,压缩表的表空间文件是使用物理页面大小而不是InnoDB页面大小创建的,这使得空压缩表的表空间文件的初始大小小于以前的 MySQL 版本。

  • 如果指定ROW_FORMAT=COMPRESSED,则可以省略KEY_BLOCK_SIZE;该 KEY_BLOCK_SIZE设置默认为值的一半innodb_page_size

  • 如果指定有效值KEY_BLOCK_SIZE ,则可以省略 ROW_FORMAT=COMPRESSED;自动启用压缩。

  • 要确定 KEY_BLOCK_SIZE,通常的最佳值,您可以为此子句创建具有不同值的同一个表的多个副本,然后测量生成的 .ibd文件的大小并查看每个文件在实际 工作负载下的执行情况。对于通用表空间,请记住删除表不会减小通用表空间 .ibd文件的大小,也不会将磁盘空间返回给操作系统。有关详细信息,请参阅 第 15.6.3.3 节,“通用表空间”

  • KEY_BLOCK_SIZE值被视为提示;InnoDB如有必要,可以使用不同的尺寸 。对于 file-per-table 表空间,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表空间的设置。有关详细信息,请参阅 第 15.6.3.3 节,“通用表空间”

  • InnoDB支持 32KB 和 64KB 页面大小,但这些页面大小不支持压缩。有关详细信息,请参阅 innodb_page_size 文档。

  • InnoDB 数据 的默认未压缩大小为 16KB。根据选项值的组合,MySQL 为表空间数据文件 ( .ibdfile) 使用 1KB、2KB、4KB、8KB 或 16KB 的页面大小。实际的压缩算法不受该 KEY_BLOCK_SIZE值的影响;该值确定每个压缩块的大小,这反过来又会影响每个压缩页中可以打包多少行。

  • 在 file-per-table 表空间中创建压缩表时,设置KEY_BLOCK_SIZE等于InnoDB 页面大小通常不会导致太多压缩。例如,设置 KEY_BLOCK_SIZE=16通常不会导致太多压缩,因为正常 InnoDB页面大小为 16KB。此设置对于具有许多 long或 列的表可能仍然有用 BLOB, 因为这些值通常压缩得很好,因此可能需要更少的溢出页面,如 第 15.9.1.5 节,“InnoDB 表的压缩工作原理”中所述VARCHARTEXT. 对于一般表空间,不允许使用KEY_BLOCK_SIZE等于页面大小的值。InnoDB有关详细信息,请参阅 第 15.6.3.3 节,“通用表空间”

  • 表的所​​有索引(包括 聚簇索引)都使用相同的页面大小进行压缩,如 CREATE TABLEorALTER TABLE语句中指定的那样。诸如 ROW_FORMAT和 之类的表属性KEY_BLOCK_SIZE不是 表CREATE INDEX语法的 一部分InnoDB,如果指定它们将被忽略(尽管如果指定它们会出现在SHOW CREATE TABLE语句的输出中)。

  • 对于与性能相关的配置选项,请参阅 第 15.9.1.3 节,“InnoDB 表的调整压缩”

压缩表的限制
  • 压缩表不能存储在 InnoDB系统表空间中。

  • 通用表空间可以包含多个表,但压缩表和未压缩表不能共存于同一个通用表空间中。

  • 尽管有子句 name ,但压缩适用于整个表及其所有关联的索引,而不适用于单个行ROW_FORMAT

  • InnoDB不支持压缩临时表。启用时 innodb_strict_mode(默认值), 如果指定或 则CREATE TEMPORARY TABLE返回错误 。如果 禁用,则会发出警告并使用非压缩行格式创建临时表。相同的限制适用于对临时表的操作。 ROW_FORMAT=COMPRESSEDKEY_BLOCK_SIZEinnodb_strict_modeALTER TABLE