X Plugin 支援壓縮透過 X Protocol 連線傳送的訊息。如果伺服器和用戶端同意使用共同支援的壓縮演算法,則可以壓縮連線。啟用壓縮會減少透過網路傳送的位元組數,但會增加伺服器和用戶端執行壓縮和解壓縮作業的額外 CPU 成本。因此,壓縮的優點主要發生在網路頻寬較低、網路傳輸時間主導壓縮和解壓縮作業成本,以及結果集較大的情況下。
不同的 MySQL 用戶端實作連線壓縮支援的方式不同;請查閱您的用戶端文件以取得詳細資訊。例如,對於傳統的 MySQL 通訊協定連線,請參閱第 6.2.8 節,「連線壓縮控制」。
依預設,X Plugin 支援 zstd、LZ4 和 Deflate 壓縮演算法。使用 Deflate 演算法進行壓縮是使用 zlib 軟體程式庫執行,因此 X Protocol 連線的 deflate_stream
壓縮演算法設定等同於傳統 MySQL 通訊協定連線的 zlib
設定。
在伺服器端,您可以設定 mysqlx_compression_algorithms
系統變數,僅包含允許的演算法,來不允許任何壓縮演算法。zstd_stream
、lz4_message
和 deflate_stream
演算法名稱可以以任何組合指定,且順序和字母大小寫並不重要。如果系統變數值是空字串,則不允許任何壓縮演算法,且連線不會壓縮。
下表比較了不同壓縮演算法的特性,並顯示它們指定的優先順序。依預設,伺服器會選擇伺服器和用戶端共同允許的最高優先順序演算法;用戶端可以稍後變更優先順序,如下所述。用戶端在指定演算法時可以使用演算法的簡短形式別名。
表 22.1:X Protocol 壓縮演算法特性
演算法 | 別名 | 壓縮率 | 吞吐量 | CPU 成本 | 預設優先順序 |
---|---|---|---|---|---|
zsth_stream |
zstd |
高 | 高 | 中 | 第一 |
lz4_message |
lz4 |
低 | 高 | 最低 | 第二 |
deflate_stream |
deflate |
高 | 低 | 最高 | 第三 |
X Protocol 允許的壓縮演算法集(無論是使用者指定的還是預設的)獨立於 MySQL 伺服器允許用於傳統 MySQL 通訊協定連線的壓縮演算法集,後者由 protocol_compression_algorithms
伺服器系統變數指定。如果您未指定 mysqlx_compression_algorithms
系統變數,X Plugin 不會回復為使用傳統 MySQL 通訊協定連線的壓縮設定。相反地,其預設是允許表 22.1,「X Protocol 壓縮演算法特性」中顯示的所有演算法。這與 TLS 環境不同,如果未設定 X Plugin 系統變數,則會使用 MySQL 伺服器設定,如第 22.5.3 節,「搭配 X Plugin 使用加密連線」中所述。如需傳統 MySQL 通訊協定連線的壓縮相關資訊,請參閱第 6.2.8 節,「連線壓縮控制」。
在用戶端,X Protocol 連線請求可以指定幾個壓縮控制參數
壓縮模式。
壓縮層級。
以優先順序排列的允許壓縮演算法清單。
某些用戶端或連接器可能不支援給定的壓縮控制功能。例如,僅 MySQL Shell 支援為 X Protocol 連線指定壓縮層級,其他 MySQL 用戶端或連接器則不支援。請參閱特定產品的文件,以取得有關支援的功能以及如何使用它們的詳細資訊。
連線模式具有以下允許的值
disabled
:連線不會壓縮。preferred
:伺服器和用戶端協商尋找他們都允許的壓縮演算法。如果沒有可用的共同演算法,則連線不會壓縮。如果未明確指定,則這是預設模式。required
:壓縮演算法協商的行為如同preferred
模式,但如果沒有可用的共同演算法,則連線請求會終止並產生錯誤。
除了針對每個連線協商壓縮演算法之外,伺服器和用戶端還可以協商適用於協商演算法的數值範圍內的壓縮層級。隨著演算法壓縮層級的增加,資料壓縮率也會增加,這會減少將訊息傳送到用戶端所需的網路頻寬和傳輸時間。但是,資料壓縮所需的工作量也會增加,會佔用伺服器上的時間、CPU 和記憶體資源。壓縮工作量的增加與壓縮率的增加之間沒有線性關係。
用戶端可以在與伺服器針對 X Protocol 連線進行功能協商期間,請求特定的壓縮層級。
在 MySQL 8.4 中,X Plugin 使用的預設壓縮層級是透過效能測試所選取,可以良好地平衡壓縮時間和網路傳輸時間。這些預設值不一定與每個演算法的程式庫預設值相同。如果用戶端未請求演算法的壓縮層級,則會套用這些預設值。預設壓縮層級最初設定為 zstd 為 3、LZ4 為 2,而 Deflate 為 3。您可以使用 mysqlx_zstd_default_compression_level
、mysqlx_lz4_default_compression_level
和 mysqlx_deflate_default_compression_level
系統變數來調整這些設定。
為了防止伺服器上的資源過度消耗,X Plugin 會針對每個演算法設定伺服器允許的最大壓縮層級。如果用戶端要求的壓縮層級超過此設定,伺服器會使用其允許的最大壓縮層級(用戶端要求的壓縮層級僅由 MySQL Shell 支援)。最初的最大壓縮層級設定為:zstd 為 11,LZ4 為 8,Deflate 為 5。您可以使用 mysqlx_zstd_max_client_compression_level
、mysqlx_lz4_max_client_compression_level
和 mysqlx_deflate_max_client_compression_level
系統變數來調整這些設定。
如果伺服器和用戶端都允許使用多個共同的演算法,則在協商期間選擇演算法的預設優先順序會顯示在 表 22.1,「X 協定壓縮演算法特性」 中。對於支援指定壓縮演算法的用戶端,連線請求可以包含用戶端允許的演算法清單,使用演算法名稱或其別名指定。清單中這些演算法的順序會被伺服器視為優先順序。這種情況下使用的演算法是客戶端清單中,伺服器端也允許的第一個演算法。然而,壓縮演算法的選項受限於壓縮模式。
如果壓縮模式是
disabled
,則壓縮演算法選項會被忽略。如果壓縮模式是
preferred
,但用戶端允許的演算法在伺服器端都不允許,則連線將不會壓縮。如果壓縮模式是
required
,但用戶端允許的演算法在伺服器端都不允許,則會發生錯誤。
要監控訊息壓縮的效果,請使用監控 X Plugin 的連線壓縮中描述的 X Plugin 狀態變數。您可以使用這些狀態變數來計算目前設定下訊息壓縮的好處,並使用該資訊來調整您的設定。
X 協定連線壓縮的運作方式如下:
演算法名稱中的
_stream
和_message
後綴表示兩種不同的操作模式:在串流模式下,單一連線中的所有 X 協定訊息都會壓縮成連續的串流,並且必須以相同的方式解壓縮 — 按照壓縮的順序,且不跳過任何訊息。在訊息模式下,每個訊息都會單獨且獨立地壓縮,並且不需要按照壓縮的順序解壓縮。此外,訊息模式也不需要解壓縮所有已壓縮的訊息。在驗證成功之前發送的任何訊息都不會套用壓縮。
壓縮不會套用至控制流程訊息,例如
Mysqlx.Ok
、Mysqlx.Error
和Mysqlx.Sql.StmtExecuteOk
訊息。如果伺服器和用戶端在功能協商期間同意使用相互允許的壓縮演算法,則所有其他 X 協定訊息都可以壓縮。如果用戶端在該階段沒有要求壓縮,則用戶端和伺服器都不會對訊息應用壓縮。
當透過 X 協定連線傳送的訊息被壓縮時,
mysqlx_max_allowed_packet
系統變數指定的限制仍然適用。在訊息酬載解壓縮後,網路封包必須小於此限制。如果超過限制,X Plugin 將返回解壓縮錯誤並關閉連線。以下幾點與客戶端要求的壓縮層級有關,這僅由 MySQL Shell 支援:
壓縮層級必須由用戶端指定為整數。如果提供了任何其他類型的值,連線將會因錯誤而關閉。
如果用戶端指定了演算法但未指定壓縮層級,則伺服器會使用該演算法的預設壓縮層級。
如果用戶端要求的演算法壓縮層級超過伺服器允許的最大層級,則伺服器會使用允許的最大層級。
如果用戶端要求的演算法壓縮層級低於伺服器允許的最小層級,則伺服器會使用允許的最小層級。
您可以使用 X Plugin 狀態變數來監控訊息壓縮的效果。當訊息壓縮在使用中時,session Mysqlx_compression_algorithm
狀態變數會顯示目前 X 協定連線正在使用的壓縮演算法,而 Mysqlx_compression_level
會顯示所選取的壓縮層級。
X Plugin 狀態變數可用於計算所選壓縮演算法的效率(資料壓縮比)以及使用訊息壓縮的整體效果。使用以下計算中的狀態變數的 session 值,以查看在已知壓縮演算法的特定 session 中,訊息壓縮的好處是什麼。或者使用狀態變數的 global 值,來檢查您的伺服器在使用 X 協定連線的所有 session 中,訊息壓縮的整體好處,包括用於這些 session 的所有壓縮演算法,以及所有未使用訊息壓縮的 session。然後,您可以透過調整允許的壓縮演算法、最大壓縮層級和預設壓縮層級來調整訊息壓縮,如為 X Plugin 配置連線壓縮中所述。
當訊息壓縮在使用中時,Mysqlx_bytes_sent
狀態變數會顯示從伺服器發送的總位元組數,包括壓縮後的訊息酬載、壓縮訊息中未壓縮的任何項目(例如 X 協定標頭)和任何未壓縮的訊息。Mysqlx_bytes_sent_compressed_payload
狀態變數會顯示以壓縮訊息酬載形式發送的總位元組數,以壓縮後的大小計算,而 Mysqlx_bytes_sent_uncompressed_frame
狀態變數則顯示相同訊息酬載的總位元組數,但以壓縮前的大小計算。因此,可以使用以下運算式計算壓縮比,這顯示了壓縮演算法的效率:
mysqlx_bytes_sent_uncompressed_frame / mysqlx_bytes_sent_compressed_payload
伺服器發送的 X 協定訊息的壓縮效果可以使用以下運算式計算:
(mysqlx_bytes_sent - mysqlx_bytes_sent_compressed_payload + mysqlx_bytes_sent_uncompressed_frame) / mysqlx_bytes_sent
對於伺服器從客戶端接收的訊息,Mysqlx_bytes_received_compressed_payload
狀態變數會顯示以壓縮訊息酬載形式接收的總位元組數,以解壓縮前的大小計算,而 Mysqlx_bytes_received_uncompressed_frame
狀態變數則顯示相同訊息酬載的總位元組數,但以解壓縮後的大小計算。Mysqlx_bytes_received
狀態變數包括以解壓縮前的大小計算的壓縮訊息酬載、壓縮訊息中任何未壓縮的項目以及任何未壓縮的訊息。