文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


17.9.2 InnoDB 頁面壓縮

InnoDB 支援駐留在每個資料表的檔案表格空間中的資料表之頁面層級壓縮。此功能稱為透明頁面壓縮。頁面壓縮是透過使用CREATE TABLEALTER TABLE 指定 COMPRESSION 屬性來啟用。支援的壓縮演算法包括 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 壓縮。孔洞穿刺大小是 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)的檔案系統,並使用 16K 或更大的 innodb_page_size 值初始化 InnoDB

啟用頁面壓縮

若要啟用頁面壓縮,請在 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:檔案系統區塊大小,這是用於打孔 (hole punching) 的單位大小。

  • 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 資料表擷取的。

# 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

員工資料表的頁面壓縮中繼資料顯示表面檔案大小為 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 增加和潛在的寫入放大。