壓縮資料表可以在單表檔案資料表空間或一般資料表空間中建立。資料表壓縮不適用於 InnoDB 系統資料表空間。系統資料表空間 (空間 0,.ibdata 檔案) 可以包含使用者建立的資料表,但它也包含永不壓縮的內部系統資料。因此,壓縮僅適用於儲存在單表檔案或一般資料表空間中的資料表 (和索引)。
在單表檔案資料表空間中建立壓縮資料表
若要在單表檔案資料表空間中建立壓縮資料表,必須啟用 innodb_file_per_table
(預設)。您可以在 MySQL 設定檔 (my.cnf
或 my.ini
) 中設定此參數,或使用 SET
陳述式動態設定。
設定 innodb_file_per_table
選項後,請在 CREATE TABLE
或 ALTER 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 TABLE
或 ALTER TABLE
KEY_BLOCK_SIZE
子句定義) 必須等於 FILE_BLOCK_SIZE/1024
。例如,如果 innodb_page_size=16384
且 FILE_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 9.0 開始,壓縮資料表的資料表空間檔案是使用實體頁面大小而非
InnoDB
頁面大小建立的,這使得空壓縮資料表的資料表空間檔案初始大小比舊版 MySQL 小。如果您指定
ROW_FORMAT=COMPRESSED
,您可以省略KEY_BLOCK_SIZE
;KEY_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。對於具有許多長BLOB
、VARCHAR
或TEXT
欄位的表格,此設定可能仍然有用,因為這些值通常可以很好地壓縮,因此可能需要較少的溢出頁面,如第 17.9.1.5 節「InnoDB 表格的壓縮運作方式」中所述。對於一般表空間,不允許KEY_BLOCK_SIZE
值等於InnoDB
頁面大小。如需更多資訊,請參閱第 17.6.3.3 節「一般表空間」。表格的所有索引(包括叢集索引)都使用相同的頁面大小進行壓縮,如
CREATE TABLE
或ALTER TABLE
陳述式中所指定。表格屬性,例如ROW_FORMAT
和KEY_BLOCK_SIZE
,不是InnoDB
表格的CREATE INDEX
語法的一部分,如果指定了這些屬性,則會被忽略(不過,如果指定了這些屬性,它們會出現在SHOW CREATE TABLE
陳述式的輸出中)。關於效能相關的組態選項,請參閱第 17.9.1.3 節「調整 InnoDB 表格的壓縮」。
壓縮表格的限制
壓縮表格不能儲存在
InnoDB
系統表空間中。一般表空間可以包含多個表格,但壓縮和未壓縮的表格不能在同一個一般表空間中共存。
壓縮適用於整個表格及其所有相關索引,而不是個別列,儘管子句名稱為
ROW_FORMAT
。InnoDB
不支援壓縮的暫存表格。當啟用innodb_strict_mode
(預設值)時,如果指定了ROW_FORMAT=COMPRESSED
或KEY_BLOCK_SIZE
,CREATE TEMPORARY TABLE
會傳回錯誤。如果停用innodb_strict_mode
,則會發出警告,並使用未壓縮的列格式建立暫存表格。相同的限制適用於暫存表格上的ALTER TABLE
操作。