Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


17.9.1.2 创建压缩表

可以在文件-per-表存储空间或公共存储空间中创建压缩表。InnoDB 系统存储空间不支持表压缩。系统存储空间(space 0,.ibdata 文件)可以包含用户创建的表,但也包含内部系统数据,这些数据永远不被压缩。因此,压缩只适用于文件-per-表或公共存储空间中的表(和索引)。

Creating a Compressed Table in File-Per-Table 表pace

要在文件-per-表存储空间中创建压缩表,需要启用innodb_file_per_table(默认情况下)。可以在 MySQL 配置文件(my.cnfmy.ini)中设置该参数,也可以使用SET语句动态地设置该参数。

在配置innodb_file_per_table选项后,使用CREATE TABLEALTER 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;
Creating a Compressed Table in a General 表pace

要在一般表空间中创建压缩表,需要为一般表空间定义FILE_BLOCK_SIZE,该值是在创建表空间时指定的。FILE_BLOCK_SIZE值必须是相对于innodb_page_size值的有效压缩页面大小,并且压缩表的页面大小,定义在CREATE TABLEALTER TABLEKEY_BLOCK_SIZE子句中,必须等于FILE_BLOCK_SIZE/1024。例如,如果innodb_page_size=16384FILE_BLOCK_SIZE=8192,那么表的KEY_BLOCK_SIZE必须为8。更多信息,请见第17.6.3.3节,“一般表空间”

以下示例演示了创建一个通用表空间并添加一个压缩表。该示例假设默认的innodb_page_size为16K。文件块大小8192要求压缩表具有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.4开始,压缩表的表空间文件使用物理页面大小,而不是InnoDB页面大小,这使得空压缩表的表空间文件初始大小在之前的MySQL版本中小于当前版本。

  • 如果您指定ROW_FORMAT=COMPRESSED,可以省略KEY_BLOCK_SIZEKEY_BLOCK_SIZE设置默认为半个innodb_page_size值。

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

  • 确定KEY_BLOCK_SIZE的最佳值通常需要创建多个具有不同值的同一表的副本,然后测量结果的.ibd文件大小并查看每个性能如何在实际工作负载下。对于通用表空间,记住删除表不会减少通用表空间的.ibd文件大小,也不会将磁盘空间返回给操作系统。更多信息,请见第17.6.3.3节,“通用表空间”

  • 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设置。更多信息,请参见第17.6.3.3节,“一般表空间”

  • InnoDB支持32KB和64KB页面大小,但这些页面大小不支持压缩。更多信息,请参见innodb_page_size文档。

  • InnoDB 数据的默认未压缩大小为 16KB。根据选项值的组合,MySQL 对表空间数据文件(.ibd 文件)使用 1KB、2KB、4KB、8KB 或 16KB 的页大小。实际压缩算法不受 KEY_BLOCK_SIZE 值的影响;该值确定每个压缩块的大小,从而影响每个压缩页中可以包含的行数。

  • 在创建压缩表时,在文件-per-表空间中设置KEY_BLOCK_SIZE等于InnoDB页面大小通常不会导致很大的压缩。例如,设置KEY_BLOCK__SIZE=16通常不会导致很大的压缩,因为正常的InnoDB页面大小是16KB。这一设置可能仍然有用于包含许多长BLOBVARCHARTEXT列的表,因为这些值通常会压缩很好,可能因此需要更少的溢出页面,如第17.9.1.5节“InnoDB表的压缩机制”中所述。对于一般表空间,KEY_BLOCK_SIZE值等于InnoDB页面大小是不可允许的。更多信息,请见第17.6.3.3节“一般表空间”

  • 表中的所有索引(包括聚簇索引)使用相同的页面大小进行压缩,指定在CREATE TABLEALTER TABLE语句中。表属性,如ROW_FORMATKEY_BLOCK_SIZE,不是InnoDB表的CREATE INDEX语法的一部分,如果指定将被忽略(虽然如果指定,输出结果中仍然会出现在SHOW CREATE TABLE语句的输出结果中)。

  • 性能相关配置选项,请见第17.9.1.3节,“InnoDB 表压缩调整”

Restrictions on Compressed 表
  • 压缩表不能存储在InnoDB系统表空间中。

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

  • 压缩应用于整个表及其关联索引,而不是单个行,尽管ROW_FORMAT子句名称可能会导致混淆。

  • InnoDB 不支持压缩临时表。当innodb_strict_mode启用(默认),CREATE TEMPORARY TABLE如果指定了ROW_ FORMAT=COMPRESSEDKEY_BLOCK_SIZE将返回错误。如果innodb_strict_mode禁用,警告将被发出,并使用非压缩行格式创建临时表。对临时表的ALTER TABLE操作也具有相同的限制。