文档主页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


17.9.1.2 创建压缩表

可以在 独立表空间通用表空间 中创建压缩表。InnoDB 系统表空间 不支持表压缩。系统表空间(空间 0,.ibdata 文件)可以包含用户创建的表,但它也包含永远不会被压缩的内部系统数据。因此,压缩仅适用于存储在独立表空间或通用表空间中的表(和索引)。

在独立表空间中创建压缩表

要在独立表空间中创建压缩表,必须启用 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;
在通用表空间中创建压缩表

要在通用表空间中创建压缩表,必须为通用表空间定义 FILE_BLOCK_SIZE,该表空间在创建表空间时指定。 FILE_BLOCK_SIZE 值必须是相对于 innodb_page_size 值的有效压缩页面大小,并且由 CREATE TABLEALTER TABLE KEY_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。 FILE_BLOCK_SIZE 为 8192 要求压缩表的 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;
注意
  • 从 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 值的影响;该值决定了每个压缩块的大小,进而影响每个压缩页面可以容纳多少行。

  • 在每个表一个文件 的表空间中创建压缩表时,将 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 表的压缩”

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

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

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

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