Documentation Home

14.9.2 为表启用压缩

在创建压缩表之前,确保 innodb_file_per_table 配置选项已启用,并 innodb_file_format设置为 Barracuda. 您可以在 MySQL配置文件 中设置这些参数,或者在不关闭 MySQL 服务器的情况下使用my.cnf语句 。 my.iniSET

要为表启用压缩,您可以 在or 语句 中使用子句ROW_FORMAT=COMPRESSEDKEY_BLOCK_SIZE或两者 。CREATE TABLEALTER 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;
  • 如果指定ROW_FORMAT=COMPRESSED,则可以省略KEY_BLOCK_SIZE;使用默认页面大小值,该值是该 innodb_page_size值的一半。

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

  • 要确定 的最佳值 KEY_BLOCK_SIZE,通常您会为此子句创建具有不同值的同一个表的多个副本,然后测量生成的 .ibd文件的大小并查看每个文件在实际 工作负载下的执行情况。

  • KEY_BLOCK_SIZE值被视为提示;InnoDB如有必要,可以使用不同的尺寸 。值 0 表示默认压缩页面大小,是该innodb_page_size值的一半。KEY_BLOCK_SIZE只能小于或等于该值innodb_page_size 。如果指定的值大于该 innodb_page_size值,则忽略指定值,发出警告,并 KEY_BLOCK_SIZE设置为该 innodb_page_size值的一半。如果 innodb_strict_mode=ON,指定无效KEY_BLOCK_SIZE值将返回错误。

  • 有关其他与性能相关的配置选项,请参阅 第 14.9.3 节,“InnoDB 表的调整压缩”

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

设置KEY_BLOCK_SIZE等于 InnoDB 页面大小通常不会导致太多压缩。例如,设置KEY_BLOCK_SIZE=16通常不会导致太多压缩,因为正常 InnoDB 页面大小为 16KB。此设置对于具有许多 long或 列的表仍然有用BLOB, 因为这些值通常压缩得很好,因此可能需要更少的 溢出页面,如第 14.9.5 节,“InnoDB 表的压缩工作原理”中所述。 VARCHARTEXT

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

压缩表的限制

因为 MySQL 5.1 之前的版本无法处理压缩表,所以使用压缩需要指定配置参数 innodb_file_format=Barracuda,避免不小心引入兼容性问题。

表压缩也不适用于 InnoDB 系统表空间。系统表空间(空间 0,ibdata* 文件)可以包含用户数据,但它也包含内部系统信息,因此永远不会被压缩。因此,压缩仅适用于存储在其自己的表空间中的表(和索引),即在 innodb_file_per_table启用该选项的情况下创建的表。

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