X Plugin 支援壓縮透過 X Protocol 連線傳送的訊息。如果伺服器和用戶端同意使用共同支援的壓縮演算法,則可以壓縮連線。啟用壓縮會減少透過網路傳送的位元組數,但會增加伺服器和用戶端用於壓縮和解壓縮作業的額外 CPU 成本。因此,壓縮的好處主要發生在網路頻寬較低、網路傳輸時間主導壓縮和解壓縮作業的成本,以及結果集較大的情況下。
不同的 MySQL 用戶端對連線壓縮的支援方式不同;請參閱您的用戶端文件以取得詳細資訊。例如,對於傳統的 MySQL 通訊協定連線,請參閱第 6.2.8 節「連線壓縮控制」。
預設情況下,X Plugin 支援 zstd、LZ4 和 Deflate 壓縮演算法。使用 Deflate 演算法的壓縮是使用 zlib 軟體庫執行的,因此 X 通訊協定連線的 deflate_stream
壓縮演算法設定等同於傳統 MySQL 通訊協定連線的 zlib
設定。
在伺服器端,您可以透過設定 mysqlx_compression_algorithms
系統變數,只包含允許的演算法來禁止任何壓縮演算法。演算法名稱 zstd_stream
、lz4_message
和 deflate_stream
可以以任何組合指定,順序和字母大小寫並不重要。如果系統變數值為空字串,則不允許任何壓縮演算法,並且連線未壓縮。
下表比較了不同壓縮演算法的特性,並顯示了它們的指定優先順序。預設情況下,伺服器會選擇伺服器和用戶端都允許的最高優先順序演算法;用戶端可以稍後描述的方式變更優先順序。用戶端在指定演算法時可以使用演算法的簡短形式別名。
表 22.1 X 通訊協定壓縮演算法特性
演算法 | 別名 | 壓縮比 | 輸送量 | CPU 成本 | 預設優先順序 |
---|---|---|---|---|---|
zsth_stream |
zstd |
高 | 高 | 中 | 第一 |
lz4_message |
lz4 |
低 | 高 | 最低 | 第二 |
deflate_stream |
deflate |
高 | 低 | 最高 | 第三 |
X 通訊協定允許的壓縮演算法集(無論是用戶指定的還是預設的)獨立於 MySQL 伺服器允許用於傳統 MySQL 通訊協定連線的壓縮演算法集,後者由 protocol_compression_algorithms
伺服器系統變數指定。如果您未指定 mysqlx_compression_algorithms
系統變數,則 X Plugin 不會回復為使用傳統 MySQL 通訊協定連線的壓縮設定。相反地,其預設設定是允許表 22.1「X 通訊協定壓縮演算法特性」中顯示的所有演算法。這與 TLS 上下文的情況不同,在 TLS 上下文中,如果未設定 X Plugin 系統變數,則會使用 MySQL 伺服器設定,如第 22.5.3 節「使用 X Plugin 的加密連線」中所述。有關傳統 MySQL 通訊協定連線的壓縮資訊,請參閱第 6.2.8 節「連線壓縮控制」。
在用戶端方面,X 通訊協定連線請求可以指定多個用於壓縮控制的參數
壓縮模式。
壓縮層級。
依優先順序排列的允許壓縮演算法清單。
某些用戶端或連接器可能不支援指定的壓縮控制功能。例如,指定 X 通訊協定連線的壓縮層級僅受 MySQL Shell 支援,而不受其他 MySQL 用戶端或連接器支援。有關支援的功能以及如何使用它們的詳細資訊,請參閱特定產品的文件。
連線模式具有以下允許的值
disabled
:連線未壓縮。preferred
:伺服器和用戶端協商以尋找它們都允許的壓縮演算法。如果沒有可用的通用演算法,則連線未壓縮。如果未明確指定,這是預設模式。required
:壓縮演算法協商的發生方式與preferred
模式相同,但如果沒有可用的通用演算法,則連線請求會以錯誤終止。
除了就每個連線的壓縮演算法達成一致之外,伺服器和用戶端還可以就適用於已同意演算法的數值範圍內的壓縮層級達成一致。隨著演算法的壓縮層級增加,資料壓縮比也會增加,這會減少將訊息傳送給用戶端所需的網路頻寬和傳輸時間。但是,資料壓縮所需的工作量也會增加,這會佔用伺服器上的時間、CPU 和記憶體資源。壓縮工作量的增加與壓縮比的增加之間沒有線性關係。
用戶端可以在與伺服器進行 X 通訊協定連線的功能協商期間請求特定的壓縮層級。
MySQL 9.0 中 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 狀態變數來監控訊息壓縮的效果。當訊息壓縮正在使用時,工作階段 Mysqlx_compression_algorithm
狀態變數會顯示目前 X 通訊協定連線使用的壓縮演算法,而 Mysqlx_compression_level
則會顯示選取的壓縮層級。
X Plugin 狀態變數可用於計算所選壓縮演算法的效率(資料壓縮率)以及使用訊息壓縮的整體效果。使用以下計算中的狀態變數的工作階段值,以查看特定工作階段使用已知壓縮演算法的訊息壓縮的好處。或者,使用狀態變數的全域值來檢查伺服器上所有使用 X 通訊協定連線的工作階段的訊息壓縮整體好處,包括所有已用於這些工作階段的壓縮演算法,以及所有未使用訊息壓縮的工作階段。然後,您可以透過調整允許的壓縮演算法、最大壓縮層級和預設壓縮層級來調整訊息壓縮,如 為 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
狀態變數包括在解壓縮前測量的壓縮訊息酬載、壓縮訊息中的任何未壓縮項目以及任何未壓縮的訊息。