10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 下载本手册 本手册节选

15.9.1.2创建压缩表

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

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

要在每个表文件的表空间中创建一个压缩表,innodb_file_per_table必须启用(默认值)。可在MySQL配置文件(my.cnfmy.ini)或动态地使用声明。

innodb_file_per_table选项时,指定ROW_FORMAT =压缩条款或KEY_BLOCK_SIZE子句,或两者都有创建表ALTER 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属性的有效压缩页大小innodb_page_size属性定义的压缩表的页大小创建表ALTER TABLEKEY_BLOCK_SIZE子句,必须等于FILE_BLOCK_SIZE / 1024.例如,如果innodb_page_size = 16384而且FILE_BLOCK_SIZE = 8192,KEY_BLOCK_SIZE表的第一个必须是8。有关更多信息,请参见15.6.3.3节“通用表空间”

下面的示例演示创建一个通用表空间并添加一个压缩表。本例假设有一个默认值innodb_page_size16 k。的FILE_BLOCK_SIZE的值要求压缩表具有KEY_BLOCK_SIZE的8。

创建表空间为ts2的数据文件为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 =压缩,你可以省略KEY_BLOCK_SIZE;的KEY_BLOCK_SIZE将默认值设置为一半innodb_page_size价值。

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

  • 确定的最佳值KEY_BLOCK_SIZE,通常,为这个子句创建相同表的多个副本,并使用不同的值,然后测量结果的大小.ibd文件,看看如何以及每个执行与现实工作负载.对于一般表空间,请记住删除表并不会减少一般表空间的大小.ibd文件,也不将磁盘空间返回给操作系统。有关更多信息,请参见15.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 =对,指定无效的KEY_BLOCK_SIZE值返回错误。对于一般表空间,有效KEY_BLOCK_SIZE值取决于FILE_BLOCK_SIZE表空间设置。有关更多信息,请参见15.6.3.3节“通用表空间”

  • InnoDB支持32KB和64KB的页面大小,但这些页面大小不支持压缩。有关更多信息,请参阅innodb_page_size10bet官方网站文档。

  • 的默认未压缩大小InnoDB数据页面是16 kb。根据选项值的组合,MySQL对表空间数据文件使用1KB、2KB、4KB、8KB或16KB的页面大小(.ibd文件)。属性不影响实际的压缩算法KEY_BLOCK_SIZE价值;该值决定每个压缩块的大小,进而影响每个压缩页可以打包多少行。

  • 在逐表文件表空间中创建压缩表时,设置KEY_BLOCK_SIZE等于InnoDB页面大小通常不会导致很大的压缩。例如,设置KEY_BLOCK_SIZE = 16通常不会造成太大的压缩,因为正常InnoDB页面大小为16KB。这个设置对于有很多长的表仍然有用VARCHAR文本列,因为这样的值通常压缩得很好,因此可能需要更少的值溢出页如在章节15.9.1.5,如何压缩InnoDB表.对于一般表空间,aKEY_BLOCK_SIZE值等于InnoDB页面大小不允许。有关更多信息,请参见15.6.3.3节“通用表空间”

  • 表的所有索引(包括聚集索引)使用相同的页面大小进行压缩创建表ALTER TABLE声明。表属性,例如ROW_FORMAT而且KEY_BLOCK_SIZE不是一部分吗创建索引语法InnoDB表,如果指定了它们,则忽略它们(尽管如果指定了,它们将出现在显示创建表声明)。

  • 有关性能相关的配置选项,请参见15.9.1.3节,InnoDB表压缩调优

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

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

  • 压缩应用于整个表及其所有关联索引,而不是应用于单个行,不管子句名称如何ROW_FORMAT

  • InnoDB不支持压缩临时表。当innodb_strict_mode启用(默认),创建临时表返回错误ROW_FORMAT =压缩KEY_BLOCK_SIZE都是确定的。如果innodb_strict_mode禁用时,将发出警告,并使用未压缩的行格式创建临时表。同样的限制适用于ALTER TABLE对临时表的操作。