中可以创建压缩表file-per-table表空间或一般的表空间.InnoDB不支持表压缩系统表空间.系统表空间(空间0,表空间0.ibdata文件)可以包含用户创建的表,但它也包含从不压缩的内部系统数据。因此,压缩只应用于存储在每个表文件或一般表空间中的表(和索引)。
在File-Per-Table表空间中创建压缩表
要在每个表文件的表空间中创建一个压缩表,innodb_file_per_table
必须启用(默认值)。可在MySQL配置文件(my.cnf
或my.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 TABLE
KEY_BLOCK_SIZE
子句,必须等于FILE_BLOCK_SIZE / 1024
.例如,如果innodb_page_size = 16384
而且FILE_BLOCK_SIZE = 8192
,KEY_BLOCK_SIZE
表的第一个必须是8。有关更多信息,请参见15.6.3.3节“通用表空间”.
下面的示例演示创建一个通用表空间并添加一个压缩表。本例假设有一个默认值innodb_page_size
16 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_size
10bet官方网站文档。的默认未压缩大小
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
对临时表的操作。