### 20.5.5 使用 X 插件的连接压缩

[](<>)[](<>)

从 MySQL 8.0.19 开始，X Plugin 支持压缩通过 X 协议连接发送的消息。如果服务器和客户端就相互支持的压缩算法达成一致，则可以压缩连接。启用压缩会减少通过网络发送的字节数，但会增加服务器和客户端用于压缩和解压缩操作的额外 CPU 成本。因此，压缩的好处主要出现在网络带宽低、网络传输时间占压缩和解压缩操作成本以及结果集很大的情况下。

笔记

不同的 MySQL 客户端实现对连接压缩的支持不同；有关详细信息，请参阅您的客户文档。例如，对于经典 MySQL 协议连接，请参阅[第 4.2.8 节，“连接压缩控制”](connection-compression-control.html).

-   [为 X 插件配置连接压缩](x-plugin-connection-compression.html#x-plugin-connection-compression-configuration)

-   [X 插件的压缩连接特性](x-plugin-connection-compression.html#x-plugin-connection-compression-characteristics)

-   [监控 X 插件的连接压缩](x-plugin-connection-compression.html#x-plugin-connection-compression-monitoring)

#### 为 X 插件配置连接压缩

默认情况下，X Plugin 支持 zstd、LZ4 和 Deflate 压缩算法。Deflate 算法的压缩是使用 zlib 软件库进行的，因此`放气流`X 协议连接的压缩算法设置等效于`zlib`经典 MySQL 协议连接的设置。

在服务器端，您可以通过设置[`mysqlx_compression_algorithms`](x-plugin-options-system-variables.html#sysvar_mysqlx_compression_algorithms)系统变量只包括那些允许的。算法名称`zstd_stream`,`lz4_message`， 和`放气流`可以任意组合指定，顺序和字母大小写不重要。如果系统变量值是空字符串，则不允许使用任何压缩算法并且未压缩连接。

下表比较了不同压缩算法的特性并显示了它们分配的优先级。默认情况下，服务器选择服务器和客户端共同允许的最高优先级算法；客户端可以更改优先级，如下所述。客户端在指定算法时可以使用算法的简称。

[](<>)

**表 20.1 X 协议压缩算法特征**

| 算法 | 别名 | 压缩率 | 吞吐量 | CPU成本 | 默认优先级 |
| --- | --- | --- | --- | ----- | ----- |
| `zsth_stream` | `zstd` | 高的 | 高的 | 中等的 | 第一的 |
| `lz4_message` | `lz4` | 低的 | 高的 | 最低 | 第二 |
| `放气流` | `放气` | 高的 | 低的 | 最高 | 第三 |

X 协议允许的压缩算法集（无论是用户指定的还是默认的）独立于 MySQL 服务器允许的经典 MySQL 协议连接的压缩算法集，由[`协议压缩算法`](server-system-variables.html#sysvar_protocol_compression_algorithms)服务器系统变量。如果您不指定[`mysqlx_compression_algorithms`](x-plugin-options-system-variables.html#sysvar_mysqlx_compression_algorithms)系统变量，X Plugin 不会回退到使用经典 MySQL 协议连接的压缩设置。相反，它的默认设置是允许所有显示在[表 20.1，“X 协议压缩算法特征”](x-plugin-connection-compression.html#x-plugin-connection-compression-algorithms).这与 TLS 上下文的情况不同，如果未设置 X 插件系统变量，则使用 MySQL 服务器设置，如中所述[第 20.5.3 节，“通过 X 插件使用加密连接”](x-plugin-encrypted-connections.html).有关经典 MySQL 协议连接的压缩信息，请参阅[第 4.2.8 节，“连接压缩控制”](connection-compression-control.html).

在客户端，一个 X 协议连接请求可以为压缩控制指定几个参数：

-   压缩模式。

-   压缩级别（来自 MySQL 8.0.20）。

-   按优先级顺序排列的允许压缩算法列表（来自 MySQL 8.0.22）。

笔记

某些客户端或连接器可能不支持给定的压缩控制功能。例如，仅 MySQL Shell 支持为 X 协议连接指定压缩级别，其他 MySQL 客户端或连接器不支持。有关支持的功能以及如何使用它们的详细信息，请参阅特定产品的文档。

连接模式具有以下允许值：

-   `禁用`: 连接未压缩。

-   `首选`：服务器和客户端协商找到他们都允许的压缩算法。如果没有可用的通用算法，则连接未压缩。如果未明确指定，这是默认模式。

-   `必需的`: 压缩算法协商发生在`首选`模式，但如果没有可用的通用算法，则连接请求会因错误而终止。

    除了就每个连接的压缩算法达成一致之外，服务器和客户端还可以就适用于商定算法的数字范围内的压缩级别达成一致。随着算法压缩级别的提高，数据压缩率也随之提高，从而减少了将消息发送到客户端所需的网络带宽和传输时间。但是，数据压缩所需的工作量也会增加，占用服务器上的时间和 CPU 和内存资源。压缩力的增加与压缩比的增加没有线性关系。

    在 MySQL 8.0.19 中，X Plugin 始终为每个算法使用库默认压缩级别（zstd 为 3，LZ4 为 0，Deflate 为 6），客户端无法协商。从 MySQL 8.0.20 开始，客户端可以在与服务器进行 X 协议连接的能力协商期间请求特定的压缩级别。

    MySQL 8.0.20 中的 X 插件使用的默认压缩级别已通过性能测试选择为压缩时间和网络传输时间之间的良好折衷。这些默认值不一定与每个算法的库默认值相同。如果客户端不请求算法的压缩级别，则它们适用。默认压缩级别最初设置为 zstd 的 3、LZ4 的 2 和 Deflate 的 3。您可以使用[`mysqlx_zstd_default_compression_level`](x-plugin-options-system-variables.html#sysvar_mysqlx_zstd_default_compression_level),[`mysqlx_lz4_default_compression_level`](x-plugin-options-system-variables.html#sysvar_mysqlx_lz4_default_compression_level)， 和[`mysqlx_deflate_default_compression_level`](x-plugin-options-system-variables.html#sysvar_mysqlx_deflate_default_compression_level)系统变量。

    为了防止服务器上过多的资源消耗，X Plugin 为每个算法设置了服务器允许的最大压缩级别。如果客户端请求超过此设置的压缩级别，则服务器使用其最大允许压缩级别（客户端的压缩级别请求仅由 MySQL Shell 支持）。zstd 的最大压缩级别最初设置为 11，LZ4 的最大压缩级别设置为 8，Deflate 的最大压缩级别设置为 5。您可以使用[`mysqlx_zstd_max_client_compression_level`](x-plugin-options-system-variables.html#sysvar_mysqlx_zstd_max_client_compression_level),[`mysqlx_lz4_max_client_compression_level`](x-plugin-options-system-variables.html#sysvar_mysqlx_lz4_max_client_compression_level)， 和[`mysqlx_deflate_max_client_compression_level`](x-plugin-options-system-variables.html#sysvar_mysqlx_deflate_max_client_compression_level)系统变量。

    如果服务器和客户端允许多个共同的算法，则在协商期间选择算法的默认优先级顺序显示在[表 20.1，“X 协议压缩算法特征”](x-plugin-connection-compression.html#x-plugin-connection-compression-algorithms).从 MySQL 8.0.22 开始，对于支持指定压缩算法的客户端，连接请求可以包含客户端允许的算法列表，使用算法名称或其别名指定。这些算法在列表中的顺序被服务器视为优先顺序。在这种情况下使用的算法是客户端列表中第一个也允许在服务器端使用的算法。但是，压缩算法的选项取决于压缩模式：

-   如果压缩模式是`禁用`，压缩算法选项被忽略。

-   如果压缩模式是`首选`但是服务器端不允许客户端允许的算法，连接是未压缩的。

-   如果压缩模式是`必需的`但是服务器端不允许客户端允许的算法，则发生错误。

    要监控消息压缩的效果，请使用 X 插件状态变量中描述的[监控 X 插件的连接压缩](x-plugin-connection-compression.html#x-plugin-connection-compression-monitoring).您可以使用这些状态变量来计算使用当前设置的消息压缩的好处，并使用该信息来调整您的设置。

#### X 插件的压缩连接特性

X 协议连接压缩具有以下行为和边界：

-   这`_溪流`和`_信息`算法名称中的后缀指的是两种不同的操作模式： 在流模式中，单个连接中的所有 X 协议消息都被压缩成一个连续的流，并且必须以相同的方式解压缩——按照它们被压缩的顺序并且不跳过任何消息。在消息模式下，每条消息都是单独独立压缩的，不需要按照压缩顺序进行解压缩。此外，消息模式不需要解压缩所有压缩消息。

-   压缩不适用于验证成功之前发送的任何消息。

-   压缩不适用于控制流消息，例如`Mysqlx.Ok`,`Mysqlx.Error`， 和`Mysqlx.Sql.StmtExecuteOk`消息。

-   如果服务器和客户端在能力协商期间就相互允许的压缩算法达成一致，则可以压缩所有其他 X 协议消息。如果客户端在该阶段没有请求压缩，则客户端和服务器都不会对消息应用压缩。

-   当通过 X 协议连接发送的消息被压缩时，由[`mysqlx_max_allowed_pa​​cket`](x-plugin-options-system-variables.html#sysvar_mysqlx_max_allowed_packet)系统变量仍然适用。解压消息负载后，网络数据包必须小于此限制。如果超出限制，X Plugin 返回解压错误并关闭连接。

-   以下几点与客户端的压缩级别请求有关，仅 MySQL Shell 支持：

    -   压缩级别必须由客户端指定为整数。如果提供了任何其他类型的值，则连接将关闭并出现错误。

    -   如果客户端指定算法但未指定压缩级别，则服务器将使用其默认的算法压缩级别。

    -   如果客户端请求的算法压缩级别超过服务器最大允许级别，则服务器使用最大允许级别。

    -   如果客户端请求的算法压缩级别低于服务器允许的最低级别，服务器将使用允许的最低级别。

#### 监视X插件的连接压缩

您可以使用X插件状态变量监控消息压缩的效果。在使用消息压缩时，会话[`Mysqlx_压缩算法`](x-plugin-status-variables.html#statvar_Mysqlx_compression_algorithm)状态变量显示当前X协议连接使用的压缩算法，以及[`Mysqlx_压缩_级别`](x-plugin-status-variables.html#statvar_Mysqlx_compression_level)显示选定的压缩级别。这些会话状态变量可从MySQL 8.0.20获得。

在MySQL 8.0.19中，可以使用X个插件状态变量来计算所选压缩算法的效率（数据压缩比），以及使用消息压缩的总体效果。在下面的计算中使用状态变量的会话值，查看消息压缩对于使用已知压缩算法的特定会话的好处。或者使用状态变量的全局值来检查使用X协议连接的所有会话中服务器的消息压缩的总体好处，包括用于这些会话的所有压缩算法，以及未使用消息压缩的所有会话。然后，可以通过调整允许的压缩算法、最大压缩级别和默认压缩级别来调整消息压缩，如中所述[为X插件配置连接压缩](x-plugin-connection-compression.html#x-plugin-connection-compression-configuration).

在使用消息压缩时[`Mysqlx_字节_已发送`](x-plugin-status-variables.html#statvar_Mysqlx_bytes_sent)status变量显示从服务器发送的字节总数，包括压缩后测量的压缩消息有效负载、压缩消息中未压缩的任何项目（如X协议头）以及任何未压缩的消息。这个[`Mysqlx_字节_发送_压缩_有效载荷`](x-plugin-status-variables.html#statvar_Mysqlx_bytes_sent_compressed_payload)status变量显示作为压缩消息有效负载发送的字节总数，在压缩后测量，以及[`Mysqlx_字节_发送_未压缩_帧`](x-plugin-status-variables.html#statvar_Mysqlx_bytes_sent_uncompressed_frame)status变量显示相同消息有效负载的总字节数，但在压缩之前测量。因此，可以使用以下表达式计算显示压缩算法效率的压缩比：

```
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_字节_接收_压缩_有效载荷`](x-plugin-status-variables.html#statvar_Mysqlx_bytes_received_compressed_payload)status变量显示作为压缩消息有效负载接收的字节总数，在解压缩之前测量，以及[`Mysqlx_字节_已接收_未压缩_帧`](x-plugin-status-variables.html#statvar_Mysqlx_bytes_received_uncompressed_frame)status变量显示那些相同消息有效负载的总字节数，但在解压缩后测量。这个[`Mysqlx_字节_已接收`](x-plugin-status-variables.html#statvar_Mysqlx_bytes_received)状态变量包括解压缩前测量的压缩消息有效载荷、压缩消息中的任何未压缩项以及任何未压缩消息。
