與伺服器的連線可以使用用戶端和伺服器之間傳輸的壓縮,以減少透過連線傳送的位元組數。預設情況下,連線未壓縮,但如果伺服器和用戶端就相互允許的壓縮演算法達成一致,則可以壓縮。
壓縮連線起源於用戶端,但會影響用戶端和伺服器端的 CPU 負載,因為兩端都會執行壓縮和解壓縮操作。由於啟用壓縮會降低效能,因此其優點主要在於網路頻寬較低、網路傳輸時間在壓縮和解壓縮操作的成本中佔主導地位,且結果集很大時。
本節說明可用的壓縮控制組態參數以及可用於監控壓縮使用的資訊來源。它適用於傳統的 MySQL 協定連線。
壓縮控制適用於用戶端程式與伺服器的連線,以及參與來源/副本複製或群組複製的伺服器。壓縮控制不適用於 FEDERATED
資料表的連線。在以下討論中,「用戶端連線」是簡寫,表示支援壓縮的任何來源與伺服器的連線,除非上下文指示特定的連線類型。
連線至 MySQL 伺服器執行個體的 X 協定連線支援壓縮,但 X 協定連線的壓縮與此處說明的傳統 MySQL 協定連線的壓縮獨立運作,並單獨控制。有關 X 協定連線壓縮的資訊,請參閱第 22.5.5 節「使用 X 外掛程式的連線壓縮」。
這些組態參數可用於控制連線壓縮
protocol_compression_algorithms
系統變數設定伺服器允許用於傳入連線的壓縮演算法。--compression-algorithms
和--zstd-compression-level
命令列選項設定以下用戶端程式的允許壓縮演算法和zstd
壓縮等級:mysql、mysqladmin、mysqlbinlog、mysqlcheck、mysqldump、mysqlimport、mysqlshow、mysqlslap 和 mysqltest。MySQL Shell 也提供這些命令列選項。mysql_options()
函式的MYSQL_OPT_COMPRESSION_ALGORITHMS
和MYSQL_OPT_ZSTD_COMPRESSION_LEVEL
選項設定使用 MySQL C API 的用戶端程式的允許壓縮演算法和zstd
壓縮等級。CHANGE REPLICATION SOURCE TO
陳述式的SOURCE_COMPRESSION_ALGORITHMS
和SOURCE_ZSTD_COMPRESSION_LEVEL
選項設定參與來源/副本複製的副本伺服器的允許壓縮演算法和zstd
壓縮等級。group_replication_recovery_compression_algorithms
和group_replication_recovery_zstd_compression_level
系統變數設定新成員加入群組並連線至捐贈者時,用於群組複製復原連線的允許壓縮演算法和zstd
壓縮等級。
啟用指定壓縮演算法的組態參數是字串值,並採用一個或多個以逗號分隔的壓縮演算法名稱列表,依任何順序,從以下項目中選擇(不區分大小寫)
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 用戶端啟動
zlib
或uncompressed
連線,請像這樣調用它:mysql --compression-algorithms=zlib,uncompressed
若要設定複本使用
zlib
或zstd
連線連線到來源,並為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 連線壓縮控制的資訊,請參閱使用壓縮連線。
舊式壓縮參數會與較新的參數互動,且其語意會變更如下:
舊式
--compress
選項的含義取決於是否指定了--compression-algorithms
:當未指定
--compression-algorithms
時,--compress
等同於指定zlib,uncompressed
的用戶端演算法集。當指定
--compression-algorithms
時,--compress
等同於指定zlib
的演算法集,且完整的用戶端演算法集是zlib
與--compression-algorithms
指定的演算法的聯集。例如,同時使用--compress
和--compression-algorithms=zlib,zstd
時,允許的演算法集是zlib
加zlib,zstd
,也就是zlib,zstd
。同時使用--compress
和--compression-algorithms=zstd,uncompressed
時,允許的演算法集是zlib
加zstd,uncompressed
,也就是zlib,zstd,uncompressed
。
舊式
MYSQL_OPT_COMPRESS
選項與mysql_options()
C API 函數的MYSQL_OPT_COMPRESSION_ALGORITHMS
選項之間會發生相同的互動類型。如果啟用
replica_compressed_protocol
系統變數,它會優先於SOURCE_COMPRESSION_ALGORITHMS
,且如果來源和複本都允許,連線到來源會使用zlib
壓縮。如果停用replica_compressed_protocol
,則會套用SOURCE_COMPRESSION_ALGORITHMS
的值。
Compression
狀態變數為 ON
或 OFF
,表示目前的連線是否使用壓縮。
如果目前連線啟用壓縮,則 mysql 用戶端的 \status
命令會顯示一行 Protocol: Compressed
。如果該行不存在,則連線未壓縮。
MySQL Shell \status
命令會顯示 Compression:
行,其中會顯示 Disabled
或 Enabled
,表示連線是否已壓縮。
以下其他資訊來源可用於監控連線壓縮:
若要監控用戶端連線所使用的壓縮,請使用
Compression_algorithm
和Compression_level
狀態變數。對於目前的連線,它們的值分別表示壓縮演算法和壓縮層級。若要判斷伺服器設定為允許哪些連入連線的壓縮演算法,請檢查
protocol_compression_algorithms
系統變數。對於來源/複本複寫連線,可從多個來源取得設定的壓縮演算法和壓縮層級:
效能架構
replication_connection_configuration
表格具有COMPRESSION_ALGORITHMS
和ZSTD_COMPRESSION_LEVEL
資料行。mysql.slave_master_info
系統表格具有Master_compression_algorithms
和Master_zstd_compression_level
資料行。如果存在master.info
檔案,它也會包含這些值的行。