14.9.1.2 创建压缩 table

压缩 table 可以在file-per-tabletable 空间或general tablespaces中创建。table 压缩不适用于 InnoDB system tablespace。系统 table 空间(空间 0,.ibdata files)可以包含用户创建的 table,但也包含内部系统数据,该数据永远不会被压缩。因此,压缩仅适用于每个 table 文件或常规 table 空间中存储的 table(和索引)。

在“每 table 文件”table 空间中创建压缩 table

要在每个 table 文件 table 空间中创建压缩 table,必须启用innodb_file_per_table(MySQL 5.6.6 中的默认设置),并且innodb_file_format必须设置为Barracuda。您可以在 MySQL 配置文件(my.cnfmy.ini)中或使用SET语句动态设置这些参数。

配置innodb_file_per_tableinnodb_file_format选项后,请在CREATE TABLEALTER TABLE语句中指定ROW_FORMAT=COMPRESSED子句或KEY_BLOCK_SIZE子句,或同时指定两者,以在每个 table 文件 table 空间中创建压缩 table。

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

SET GLOBAL innodb_file_per_table=1;
SET GLOBAL innodb_file_format=Barracuda;
CREATE TABLE t1
 (c1 INT PRIMARY KEY)
 ROW_FORMAT=COMPRESSED
 KEY_BLOCK_SIZE=8;
在常规 table 空间中创建压缩 table

要在常规 table 空间中创建压缩 table,必须为常规 table 空间定义FILE_BLOCK_SIZE,该名称在创建 table 空间时指定。 FILE_BLOCK_SIZE值必须是相对于innodb_page_size值的有效压缩页面大小,并且由CREATE TABLEALTER TABLE KEY_BLOCK_SIZE子句定义的压缩 table 的页面大小必须等于FILE_BLOCK_SIZE/1024。例如,如果innodb_page_size=16384FILE_BLOCK_SIZE=8192,则 table 的KEY_BLOCK_SIZE必须为 8.有关更多信息,请参见第 14.6.3.3 节“常规 table 空间”

下面的示例演示如何创建常规 table 空间并添加压缩 table。该示例假定默认innodb_page_size为 16K。 8192 的FILE_BLOCK_SIZE要求压缩 table 的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;
Notes
  • 如果指定ROW_FORMAT=COMPRESSED,则可以省略KEY_BLOCK_SIZEKEY_BLOCK_SIZE设置默认为innodb_page_size值的一半。

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

  • 要确定KEY_BLOCK_SIZE,的最佳值,通常需要为该子句创建具有不同值的同一张 table 的多个副本,然后测量生成的.ibd文件的大小,并查看每个文件与实际workload的性能如何。对于常规 table 空间,请记住,删除 table 不会减小常规 table 空间.ibd文件的大小,也不会将磁盘空间返回给 os。有关更多信息,请参见第 14.6.3.3 节“常规 table 空间”

  • KEY_BLOCK_SIZE值被视为提示;如有必要,InnoDB可以使用其他大小。对于每 table 文件 table 空间,KEY_BLOCK_SIZE只能小于或等于innodb_page_size值。如果指定的值大于innodb_page_size值,则将忽略指定的值,并发出警告,并将KEY_BLOCK_SIZE设置为innodb_page_size值的一半。如果innodb_strict_mode=ON,则指定无效的KEY_BLOCK_SIZE值将返回错误。对于常规 table 空间,有效的KEY_BLOCK_SIZE值取决于 table 空间的FILE_BLOCK_SIZE设置。有关更多信息,请参见第 14.6.3.3 节“常规 table 空间”

  • 32 KB 和 64KB 页面大小不支持压缩。有关更多信息,请参阅innodb_page_size文档。

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

  • 在每个 table 文件 table 空间中创建压缩 table 时,将KEY_BLOCK_SIZE设置为等于InnoDB page size通常不会导致太多压缩。例如,设置KEY_BLOCK_SIZE=16通常不会导致太多压缩,因为正常的InnoDB页面大小为 16KB。对于具有许多长BLOBVARCHARTEXT列的 table,此设置可能仍然有用,因为此类值通常压缩得很好,因此可能需要较少的overflow pages,如第 14.9.1.5 节“ InnoDBtable 的压缩方式”中所述。对于常规 table 空间,不允许使用KEY_BLOCK_SIZE值等于InnoDB页大小。有关更多信息,请参见第 14.6.3.3 节“常规 table 空间”

  • 使用CREATE TABLEALTER TABLE语句中指定的相同页面大小来压缩 table 的所有索引(包括clustered index)。诸如ROW_FORMATKEY_BLOCK_SIZE之类的 table 属性不是InnoDBtable 的CREATE INDEX语法的一部分,如果指定了它们,则将被忽略(尽管,如果指定了它们,它们将出现在显示创建 table语句的输出中)。

  • 有关与性能相关的配置选项,请参阅第 14.9.1.3 节“为 InnoDBtable 调整压缩”

压缩 table 的限制
  • 5.1 之前的 MySQL 版本无法处理压缩 table。

  • 压缩 table 不能存储在InnoDB系统 table 空间中。

  • 常规 table 空间可以包含多个 table,但是压缩 table 和未压缩 table 不能在同一常规 table 空间中共存。

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