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


MySQL 8.4 參考手冊  /  ...  /  連線壓縮控制

6.2.8 連線壓縮控制

與伺服器的連線可以使用用戶端和伺服器之間傳輸的壓縮,以減少透過連線傳送的位元組數。預設情況下,連線未壓縮,但如果伺服器和用戶端就相互允許的壓縮演算法達成一致,則可以壓縮。

壓縮連線起源於用戶端,但會影響用戶端和伺服器端的 CPU 負載,因為兩端都會執行壓縮和解壓縮操作。由於啟用壓縮會降低效能,因此其優點主要在於網路頻寬較低、網路傳輸時間在壓縮和解壓縮操作的成本中佔主導地位,且結果集很大時。

本節說明可用的壓縮控制組態參數以及可用於監控壓縮使用的資訊來源。它適用於傳統的 MySQL 協定連線。

壓縮控制適用於用戶端程式與伺服器的連線,以及參與來源/副本複製或群組複製的伺服器。壓縮控制不適用於 FEDERATED 資料表的連線。在以下討論中,用戶端連線是簡寫,表示支援壓縮的任何來源與伺服器的連線,除非上下文指示特定的連線類型。

注意

連線至 MySQL 伺服器執行個體的 X 協定連線支援壓縮,但 X 協定連線的壓縮與此處說明的傳統 MySQL 協定連線的壓縮獨立運作,並單獨控制。有關 X 協定連線壓縮的資訊,請參閱第 22.5.5 節「使用 X 外掛程式的連線壓縮」

設定連線壓縮

這些組態參數可用於控制連線壓縮

啟用指定壓縮演算法的組態參數是字串值,並採用一個或多個以逗號分隔的壓縮演算法名稱列表,依任何順序,從以下項目中選擇(不區分大小寫)

  • zlib:允許使用 zlib 壓縮演算法的連線。

  • zstd:允許使用 zstd 壓縮演算法的連線。

  • uncompressed:允許未壓縮的連線。

注意

由於 uncompressed 是一個可能設定或可能未設定的演算法名稱,因此可以設定 MySQL 允許未壓縮的連線。

範例

  • 若要設定伺服器允許用於連入連線的壓縮演算法,請設定 protocol_compression_algorithms 系統變數。預設情況下,伺服器允許所有可用的演算法。若要在啟動時明確設定此設定,請在伺服器 my.cnf 檔案中使用以下幾行:

    [mysqld]
    protocol_compression_algorithms=zlib,zstd,uncompressed

    若要在執行階段將 protocol_compression_algorithms 系統變數設定並永久保存為該值,請使用以下陳述式:

    SET PERSIST protocol_compression_algorithms='zlib,zstd,uncompressed';

    SET PERSIST 設定執行中 MySQL 實例的值。它也會儲存該值,使其在後續伺服器重新啟動時也能保留。若要在不讓該值在後續重新啟動時保留的情況下,變更執行中 MySQL 實例的值,請使用 GLOBAL 關鍵字,而非 PERSIST。請參閱章節 15.7.6.1,「SET 變數賦值語法」

  • 若要只允許使用 zstd 壓縮的連入連線,請在啟動時將伺服器設定如下:

    [mysqld]
    protocol_compression_algorithms=zstd

    或者,若要在執行階段進行變更:

    SET PERSIST protocol_compression_algorithms='zstd';
  • 若要允許 mysql 用戶端啟動 zlibuncompressed 連線,請像這樣調用它:

    mysql --compression-algorithms=zlib,uncompressed
  • 若要設定複本使用 zlibzstd 連線連線到來源,並為 zstd 連線設定壓縮層級 7,請使用 CHANGE REPLICATION SOURCE TO 陳述式:

    CHANGE REPLICATION SOURCE TO
      SOURCE_COMPRESSION_ALGORITHMS = 'zlib,zstd',
      SOURCE_ZSTD_COMPRESSION_LEVEL = 7;

    這假設 replica_compressed_protocol 系統變數已停用,原因詳述於設定舊式連線壓縮

為了成功設定連線,連線的雙方必須就相互允許的壓縮演算法達成共識。演算法協商流程會嘗試使用 zlib,然後是 zstd,最後是 uncompressed。如果雙方無法找到共同的演算法,則連線嘗試會失敗。

由於雙方都必須就壓縮演算法達成共識,且由於 uncompressed 是一個不一定允許的演算法值,因此不一定會回退到未壓縮的連線。例如,如果伺服器設定為允許 zstd,而用戶端設定為允許 zlib,uncompressed,則用戶端根本無法連線。在這種情況下,雙方沒有共同的演算法,因此連線嘗試會失敗。

可以指定 zstd 壓縮層級的組態參數採用 1 到 22 的整數值,值越大表示壓縮層級越高。預設的 zstd 壓縮層級為 3。壓縮層級設定對不使用 zstd 壓縮的連線沒有影響。

可設定的 zstd 壓縮層級可以在減少網路流量和增加 CPU 負載,與增加網路流量和減少 CPU 負載之間進行選擇。較高的壓縮層級會減少網路壅塞,但額外的 CPU 負載可能會降低伺服器效能。

設定舊式連線壓縮

在 MySQL 8.0.18 之前,可以使用以下組態參數來控制連線壓縮:

  • 用戶端程式支援 --compress 命令列選項,以指定用於連線到伺服器的壓縮。

  • 對於使用 MySQL C API 的程式,啟用 mysql_options() 函數的 MYSQL_OPT_COMPRESS 選項,指定用於連線到伺服器的壓縮。

  • 對於來源/複本複寫,啟用系統變數 replica_compressed_protocol 指定用於複本連線到來源的壓縮。

在每種情況下,當指定使用壓縮時,如果雙方都允許,連線會使用 zlib 壓縮演算法,否則會回退到未壓縮的連線。

自 MySQL 8.0.18 起,由於引入了其他壓縮參數以更好地控制連線壓縮(詳述於設定連線壓縮),因此剛才描述的壓縮參數會變成舊式參數。MySQL Shell 除外,其中 --compress 命令列選項仍然有效,並且可用於請求壓縮,而無需選擇壓縮演算法。有關 MySQL Shell 連線壓縮控制的資訊,請參閱使用壓縮連線

舊式壓縮參數會與較新的參數互動,且其語意會變更如下:

監控連線壓縮

Compression 狀態變數為 ONOFF,表示目前的連線是否使用壓縮。

如果目前連線啟用壓縮,則 mysql 用戶端的 \status 命令會顯示一行 Protocol: Compressed。如果該行不存在,則連線未壓縮。

MySQL Shell \status 命令會顯示 Compression: 行,其中會顯示 DisabledEnabled,表示連線是否已壓縮。

以下其他資訊來源可用於監控連線壓縮:

  • 若要監控用戶端連線所使用的壓縮,請使用 Compression_algorithmCompression_level 狀態變數。對於目前的連線,它們的值分別表示壓縮演算法和壓縮層級。

  • 若要判斷伺服器設定為允許哪些連入連線的壓縮演算法,請檢查 protocol_compression_algorithms 系統變數。

  • 對於來源/複本複寫連線,可從多個來源取得設定的壓縮演算法和壓縮層級:

    • 效能架構 replication_connection_configuration 表格具有 COMPRESSION_ALGORITHMSZSTD_COMPRESSION_LEVEL 資料行。

    • mysql.slave_master_info 系統表格具有 Master_compression_algorithmsMaster_zstd_compression_level 資料行。如果存在 master.info 檔案,它也會包含這些值的行。