與伺服器的連線可以使用用戶端和伺服器之間流量的壓縮,以減少透過連線傳送的位元組數。預設情況下,連線是不壓縮的,但如果伺服器和用戶端同意互相允許的壓縮演算法,則可以壓縮連線。
壓縮的連線源自用戶端,但會影響用戶端和伺服器端的 CPU 負載,因為兩端都會執行壓縮和解壓縮操作。由於啟用壓縮會降低效能,因此其優點主要出現在網路頻寬較低、網路傳輸時間主導壓縮和解壓縮操作的成本,以及結果集較大的情況下。
本節說明可用的壓縮控制組態參數和可用於監控壓縮使用的資訊來源。它適用於經典的 MySQL 協定連線。
壓縮控制適用於用戶端程式連線到伺服器,以及參與來源/複本複寫或群組複寫的伺服器。壓縮控制不適用於 FEDERATED
資料表的連線。在以下討論中,「用戶端連線」是簡寫,代表來自任何支援壓縮來源的伺服器連線,除非內容指示特定的連線類型。
與 MySQL 伺服器執行個體的 X 協定連線支援壓縮,但 X 協定連線的壓縮與此處描述的傳統 MySQL 協定連線的壓縮獨立運作,並單獨控制。請參閱第 22.5.5 節,「使用 X 外掛程式的連線壓縮」,以取得關於 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
系統變數。對於來源/複本複寫連線,可從多個來源取得已設定的壓縮演算法和壓縮等級
Performance Schema
replication_connection_configuration
表格具有COMPRESSION_ALGORITHMS
和ZSTD_COMPRESSION_LEVEL
資料行。mysql.slave_master_info
系統表格具有Master_compression_algorithms
和Master_zstd_compression_level
資料行。如果存在master.info
檔案,則它也會包含這些值的幾行。