文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


17.9.1.2 建立壓縮資料表

壓縮資料表可以在單表檔案資料表空間或一般資料表空間中建立。資料表壓縮不適用於 InnoDB 系統資料表空間。系統資料表空間 (空間 0,.ibdata 檔案) 可以包含使用者建立的資料表,但它也包含永不壓縮的內部系統資料。因此,壓縮僅適用於儲存在單表檔案或一般資料表空間中的資料表 (和索引)。

在單表檔案資料表空間中建立壓縮資料表

若要在單表檔案資料表空間中建立壓縮資料表,必須啟用 innodb_file_per_table (預設)。您可以在 MySQL 設定檔 (my.cnfmy.ini) 中設定此參數,或使用 SET 陳述式動態設定。

設定 innodb_file_per_table 選項後,請在 CREATE TABLEALTER 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 TABLEALTER TABLE KEY_BLOCK_SIZE 子句定義) 必須等於 FILE_BLOCK_SIZE/1024。例如,如果 innodb_page_size=16384FILE_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_SIZEKEY_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。對於具有許多長BLOBVARCHARTEXT 欄位的表格,此設定可能仍然有用,因為這些值通常可以很好地壓縮,因此可能需要較少的溢出頁面,如第 17.9.1.5 節「InnoDB 表格的壓縮運作方式」中所述。對於一般表空間,不允許 KEY_BLOCK_SIZE 值等於 InnoDB 頁面大小。如需更多資訊,請參閱第 17.6.3.3 節「一般表空間」

  • 表格的所有索引(包括叢集索引)都使用相同的頁面大小進行壓縮,如 CREATE TABLEALTER TABLE 陳述式中所指定。表格屬性,例如 ROW_FORMATKEY_BLOCK_SIZE,不是 InnoDB 表格的 CREATE INDEX 語法的一部分,如果指定了這些屬性,則會被忽略(不過,如果指定了這些屬性,它們會出現在 SHOW CREATE TABLE 陳述式的輸出中)。

  • 關於效能相關的組態選項,請參閱第 17.9.1.3 節「調整 InnoDB 表格的壓縮」

壓縮表格的限制
  • 壓縮表格不能儲存在 InnoDB 系統表空間中。

  • 一般表空間可以包含多個表格,但壓縮和未壓縮的表格不能在同一個一般表空間中共存。

  • 壓縮適用於整個表格及其所有相關索引,而不是個別列,儘管子句名稱為 ROW_FORMAT

  • InnoDB 不支援壓縮的暫存表格。當啟用 innodb_strict_mode(預設值)時,如果指定了 ROW_FORMAT=COMPRESSEDKEY_BLOCK_SIZECREATE TEMPORARY TABLE 會傳回錯誤。如果停用 innodb_strict_mode,則會發出警告,並使用未壓縮的列格式建立暫存表格。相同的限制適用於暫存表格上的 ALTER TABLE 操作。