文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式 Letter) - 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.2 InnoDB 頁面壓縮

InnoDB 支援位於每個資料表一個檔案表空間中的資料表頁面層級壓縮。此功能稱為透明頁面壓縮。透過指定具有CREATE TABLEALTER TABLECOMPRESSION 屬性來啟用頁面壓縮。支援的壓縮演算法包括 ZlibLZ4

支援的平台

頁面壓縮需要稀疏檔案和空洞釋放支援。在具有 NTFS 的 Windows 上,以及在以下 MySQL 支援的 Linux 平台子集中支援頁面壓縮,這些平台的核心層級提供空洞釋放支援

  • 使用核心版本 3.10.0-123 或更高版本的 RHEL 7 和衍生發行版

  • OEL 5.10 (UEK2) 核心版本 2.6.39 或更高版本

  • OEL 6.5 (UEK3) 核心版本 3.8.13 或更高版本

  • OEL 7.0 核心版本 3.8.13 或更高版本

  • SLE11 核心版本 3.0-x

  • SLE12 核心版本 3.12-x

  • OES11 核心版本 3.0-x

  • Ubuntu 14.0.4 LTS 核心版本 3.13 或更高版本

  • Ubuntu 12.0.4 LTS 核心版本 3.2 或更高版本

  • Debian 7 核心版本 3.2 或更高版本

注意

給定 Linux 發行版的所有可用檔案系統可能不支援空洞釋放。

頁面壓縮的運作方式

寫入頁面時,會使用指定的壓縮演算法進行壓縮。壓縮後的資料會寫入磁碟,其中空洞釋放機制會從頁面末端釋放空白區塊。如果壓縮失敗,則會原樣寫出資料。

Linux 上的空洞釋放大小

在 Linux 系統上,檔案系統區塊大小是空洞釋放所使用的單位大小。因此,只有當頁面資料可以壓縮到小於或等於 InnoDB 頁面大小減去檔案系統區塊大小的值時,頁面壓縮才會有效。例如,如果 innodb_page_size=16K 且檔案系統區塊大小為 4K,則頁面資料必須壓縮到小於或等於 12K,才能使空洞釋放成為可能。

Windows 上的空洞釋放大小

在 Windows 系統上,稀疏檔案的底層基礎架構是基於 NTFS 壓縮。空洞填充 (Hole punching) 的大小是 NTFS 的壓縮單元,為 NTFS 叢集大小的 16 倍。叢集大小及其壓縮單元如下表所示:

表 17.13:Windows NTFS 叢集大小和壓縮單元

叢集大小 壓縮單元
512 位元組 8 KB
1 KB 16 KB
2 KB 32 KB
4 KB 64 KB

Windows 系統上的頁面壓縮只有在頁面資料可以被壓縮到小於或等於 InnoDB 頁面大小減去壓縮單元大小時才會生效。

預設的 NTFS 叢集大小為 4KB,其壓縮單元大小為 64KB。這表示對於開箱即用的 Windows NTFS 設定,頁面壓縮沒有任何好處,因為最大的 innodb_page_size 也為 64KB。

若要在 Windows 上使用頁面壓縮,必須以小於 4K 的叢集大小建立檔案系統,且 innodb_page_size 的大小必須至少為壓縮單元的兩倍。例如,若要在 Windows 上使用頁面壓縮,您可以建立一個叢集大小為 512 位元組的檔案系統 (其壓縮單元為 8KB),並將 InnoDB 初始化為 innodb_page_size 值為 16K 或更大。

啟用頁面壓縮

若要啟用頁面壓縮,請在 CREATE TABLE 陳述式中指定 COMPRESSION 屬性。例如:

CREATE TABLE t1 (c1 INT) COMPRESSION="zlib";

您也可以在 ALTER TABLE 陳述式中啟用頁面壓縮。但是,ALTER TABLE ... COMPRESSION 僅更新表格空間壓縮屬性。在設定新的壓縮演算法之後發生的表格空間寫入會使用新的設定,但是若要將新的壓縮演算法套用至現有頁面,您必須使用 OPTIMIZE TABLE 重建表格。

ALTER TABLE t1 COMPRESSION="zlib";
OPTIMIZE TABLE t1;

停用頁面壓縮

若要停用頁面壓縮,請使用 ALTER TABLE 設定 COMPRESSION=None。在設定 COMPRESSION=None 之後發生的表格空間寫入將不再使用頁面壓縮。若要解壓縮現有的頁面,您必須在設定 COMPRESSION=None 之後使用 OPTIMIZE TABLE 重建表格。

ALTER TABLE t1 COMPRESSION="None";
OPTIMIZE TABLE t1;

頁面壓縮中繼資料

頁面壓縮中繼資料可在 Information Schema 的 INNODB_TABLESPACES 表格中的以下欄位中找到:

  • FS_BLOCK_SIZE:檔案系統區塊大小,也就是用於空洞填充的單位大小。

  • FILE_SIZE:檔案的顯示大小,代表檔案的最大大小 (未壓縮)。

  • ALLOCATED_SIZE:檔案的實際大小,也就是磁碟上配置的空間大小。

注意

在類 Unix 系統上,ls -l tablespace_name.ibd 會顯示檔案的顯示大小 (相當於 FILE_SIZE),單位為位元組。若要檢視磁碟上配置的實際空間大小 (相當於 ALLOCATED_SIZE),請使用 du --block-size=1 tablespace_name.ibd--block-size=1 選項會以位元組而不是區塊列印配置的空間,以便與 ls -l 的輸出進行比較。

使用 SHOW CREATE TABLE 來檢視目前的頁面壓縮設定 (ZlibLz4None)。一個表格可能包含不同壓縮設定的頁面混合。

在以下範例中,會從 Information Schema INNODB_TABLESPACES 表格擷取 employees 表格的頁面壓縮中繼資料。

# Create the employees table with Zlib page compression

CREATE TABLE employees (
    emp_no      INT             NOT NULL,
    birth_date  DATE            NOT NULL,
    first_name  VARCHAR(14)     NOT NULL,
    last_name   VARCHAR(16)     NOT NULL,
    gender      ENUM ('M','F')  NOT NULL,
    hire_date   DATE            NOT NULL,
    PRIMARY KEY (emp_no)
) COMPRESSION="zlib";

# Insert data (not shown)

# Query page compression metadata in INFORMATION_SCHEMA.INNODB_TABLESPACES

mysql> SELECT SPACE, NAME, FS_BLOCK_SIZE, FILE_SIZE, ALLOCATED_SIZE FROM
       INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME='employees/employees'\G
*************************** 1. row ***************************
SPACE: 45
NAME: employees/employees
FS_BLOCK_SIZE: 4096
FILE_SIZE: 23068672
ALLOCATED_SIZE: 19415040

employees 表格的頁面壓縮中繼資料顯示,檔案的顯示大小為 23068672 位元組,而實際檔案大小 (使用頁面壓縮) 為 19415040 位元組。檔案系統區塊大小為 4096 位元組,也就是用於空洞填充的區塊大小。

識別使用頁面壓縮的表格

若要識別已啟用頁面壓縮的表格,您可以檢查 Information Schema TABLES 表格的 CREATE_OPTIONS 欄位中是否定義了 COMPRESSION 屬性的表格。

mysql> SELECT TABLE_NAME, TABLE_SCHEMA, CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES 
       WHERE CREATE_OPTIONS LIKE '%COMPRESSION=%';
+------------+--------------+--------------------+
| TABLE_NAME | TABLE_SCHEMA | CREATE_OPTIONS     |
+------------+--------------+--------------------+
| employees  | test         | COMPRESSION="zlib" |
+------------+--------------+--------------------+

SHOW CREATE TABLE 也會顯示 COMPRESSION 屬性 (如果已使用)。

頁面壓縮限制和使用注意事項

  • 如果檔案系統區塊大小 (或 Windows 上的壓縮單元大小) * 2 > innodb_page_size,則會停用頁面壓縮。

  • 不支援駐留在共用表格空間 (包括系統表格空間、暫存表格空間和一般表格空間) 中的表格進行頁面壓縮。

  • 不支援還原記錄表格空間進行頁面壓縮。

  • 不支援重做記錄頁面進行頁面壓縮。

  • 用於空間索引的 R 樹頁面不會壓縮。

  • 屬於壓縮表格 (ROW_FORMAT=COMPRESSED) 的頁面會保持原樣。

  • 在復原期間,更新的頁面會以未壓縮的形式寫出。

  • 在不支援所使用的壓縮演算法的伺服器上載入已進行頁面壓縮的表格空間會導致 I/O 錯誤。

  • 在降級到不支援頁面壓縮的較早版本 MySQL 之前,請先解壓縮使用頁面壓縮功能的表格。若要解壓縮表格,請執行 ALTER TABLE ... COMPRESSION=NoneOPTIMIZE TABLE

  • 如果所使用的壓縮演算法在兩個伺服器上都可用,則可以在 Linux 和 Windows 伺服器之間複製已進行頁面壓縮的表格空間。

  • 將已進行頁面壓縮的表格空間檔案從一個主機移動到另一個主機時,若要保留頁面壓縮,需要一個可以保留稀疏檔案的公用程式。

  • 在 Fusion-io 硬體上使用 NVMFS 可能會比在其他平台上獲得更好的頁面壓縮效果,因為 NVMFS 的設計目的是要充分利用空洞填充功能。

  • 將頁面壓縮功能與大型的 InnoDB 頁面大小和相對較小的檔案系統區塊大小一起使用可能會導致寫入放大。例如,最大的 InnoDB 頁面大小為 64KB,而檔案系統區塊大小為 4KB 可能會提高壓縮率,但也可能會增加緩衝池的需求,進而導致 I/O 增加和潛在的寫入放大。