### 4.2.8 连接压缩控制

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

到服务器的连接可以对客户端和服务器之间的流量使用压缩，以减少通过连接发送的字节数。默认情况下，连接是未压缩的，但如果服务器和客户端就相互允许的压缩算法达成一致，则可以对其进行压缩。

压缩连接源自客户端，但会影响客户端和服务器端的 CPU 负载，因为双方都执行压缩和解压缩操作。因为启用压缩会降低性能，所以它的好处主要出现在网络带宽低、网络传输时间占压缩和解压缩操作的成本以及结果集很大的情况下。

本节描述了可用的压缩控制配置参数和可用于监控压缩使用的信息源。它适用于经典的 MySQL 协议连接。

压缩控制适用于客户端程序和参与源/副本复制或组复制的服务器到服务器的连接。压缩控制不适用于连接`联邦`表。在下面的讨论中，“客户端连接”是从任何支持压缩的源到服务器的连接的简写，除非上下文指示特定的连接类型。

笔记

到 MySQL 服务器实例的 X 协议连接支持 MySQL 8.0.19 的压缩，但 X 协议连接的压缩独立于此处描述的经典 MySQL 协议连接的压缩运行，并且是单独控制的。看[第 20.5.5 节，“使用 X 插件进行连接压缩”](x-plugin-connection-compression.html)有关 X 协议连接压缩的信息。

-   [配置连接压缩](connection-compression-control.html#connection-compression-configuration)

-   [配置旧版连接压缩](connection-compression-control.html#connection-compression-legacy-configuration)

-   [监控连接压缩](connection-compression-control.html#connection-compression-monitoring)

#### 配置连接压缩

从 MySQL 8.0.18 开始，这些配置参数可用于控制连接压缩：

-   这[`协议压缩算法`](server-system-variables.html#sysvar_protocol_compression_algorithms)系统变量配置服务器允许传入连接的压缩算法。

-   这[`--压缩算法`](connection-options.html#option_general_compression-algorithms)和[`--zstd-压缩级别`](connection-options.html#option_general_zstd-compression-level)命令行选项配置允许的压缩算法和`zstd`这些客户端程序的压缩级别：[**mysql**](mysql.html),[**mysql管理员**](mysqladmin.html),[**mysqlbinlog**](mysqlbinlog.html),[**mysql检查**](mysqlcheck.html),[**mysql转储**](mysqldump.html),[**mysql导入**](mysqlimport.html),[**mysql泵**](mysqlpump.html),[**mysqlshow**](mysqlshow.html),[**mysqlslap**](mysqlslap.html)， 和**mysql测试**， 和[**mysql\_升级**](mysql-upgrade.html).MySQL Shell 还从其 8.0.20 版本中提供了这些命令行选项。

-   这`MYSQL_OPT_COMPRESSION_ALGORITHMS`和`MYSQL_OPT_ZSTD_COMPRESSION_LEVEL`的选项[`mysql_options()`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-options.html)功能配置允许的压缩算法和`zstd`使用 MySQL C API 的客户端程序的压缩级别。

-   这`MASTER_COMPRESSION_ALGORITHMS`和`MASTER_ZSTD_COMPRESSION_LEVEL`的选项[`将主更改为`](change-master-to.html)语句配置允许的压缩算法和`zstd`参与源/副本复制的副本服务器的压缩级别。从 MySQL 8.0.23 开始，使用语句[`将复制源更改为`](change-replication-source-to.html)和选项`SOURCE_COMPRESSION_ALGORITHMS`和`SOURCE_ZSTD_COMPRESSION_LEVEL`反而。

-   这[`group_replication_recovery_compression_algorithms`](group-replication-options.html#sysvar_group_replication_recovery_compression_algorithms)和[`group_replication_recovery_zstd_compression_level`](group-replication-options.html#sysvar_group_replication_recovery_zstd_compression_level)系统变量配置允许的压缩算法和`zstd`当新成员加入组并连接到施主时，组复制恢复连接的压缩级别。

    启用指定压缩算法的配置参数是字符串值的，并采用一个或多个以逗号分隔的压缩算法名称的列表，以任意顺序从以下项目中选择（不区分大小写）：

-   `zlib`: 允许使用`zlib`压缩算法。

-   `zstd`: 允许使用`zstd`压缩算法（zstd 1.3）。

-   `未压缩`：允许未压缩的连接。

笔记

因为`未压缩`是算法名，可以配置也可以不配置，可以配置MySQL*不是*允许未压缩的连接。

例子：

-   要配置服务器允许传入连接的压缩算法，请设置[`协议压缩算法`](server-system-variables.html#sysvar_protocol_compression_algorithms)系统变量。默认情况下，服务器允许所有可用的算法。要在启动时显式配置该设置，请在服务器中使用这些行`我的.cnf`文件：

    ```
    [mysqld]
    protocol_compression_algorithms=zlib,zstd,uncompressed
    ```

    设置和持久化[`协议压缩算法`](server-system-variables.html#sysvar_protocol_compression_algorithms)在运行时将系统变量设置为该值，请使用以下语句：

    ```
    SET PERSIST protocol_compression_algorithms='zlib,zstd,uncompressed';
    ```

    [`设置坚持`](set-variable.html)为正在运行的 MySQL 实例设置一个值。它还保存该值，使其延续到后续服务器重新启动。要更改正在运行的 MySQL 实例的值而不使其延续到后续重新启动，请使用`全球的`关键字而不是`坚持`.看[第 13.7.6.1 节，“变量赋值的 SET 语法”](set-variable.html).

-   只允许使用的传入连接`zstd`压缩，在启动时配置服务器，如下所示：

    ```
    [mysqld]
    protocol_compression_algorithms=zstd
    ```

    或者，在运行时进行更改：

    ```
    SET PERSIST protocol_compression_algorithms='zstd';
    ```

-   为了允许[**mysql**](mysql.html)客户发起`zlib`要么`未压缩`连接，像这样调用它：

    ```
    mysql --compression-algorithms=zlib,uncompressed
    ```

-   配置副本以连接到源使用`zlib`要么`zstd`连接，压缩级别为 7`zstd`连接，使用[`将复制源更改为`](change-replication-source-to.html)语句（来自 MySQL 8.0.23）或[`将主更改为`](change-master-to.html)声明（在 MySQL 8.0.23 之前）：

    ```
    CHANGE REPLICATION SOURCE TO
      SOURCE_COMPRESSION_ALGORITHMS = 'zlib,zstd',
      SOURCE_ZSTD_COMPRESSION_LEVEL = 7;
    ```

    这假设[`副本压缩协议`](replication-options-replica.html#sysvar_replica_compressed_protocol)要么[`slave_compressed_protocol`](replication-options-replica.html#sysvar_slave_compressed_protocol)系统变量被禁用，原因在[配置旧版连接压缩](connection-compression-control.html#connection-compression-legacy-configuration).

    为了成功建立连接，连接的双方必须就相互允许的压缩算法达成一致。算法协商过程尝试使用`兹利布`然后`zstd`然后`未压缩`.如果双方无法找到通用算法，则连接尝试失败。

    因为双方必须就压缩算法达成一致`未压缩`是一个不一定允许的算法值，不一定会出现回退到未压缩连接的情况。例如，如果服务器配置为允许`zstd`客户端被配置为允许`zlib，未压缩`，客户端根本无法连接。在这种情况下，双方没有共同的算法，因此连接尝试失败。

    允许指定`zstd`压缩级别取1到22之间的整数值，较大的值表示压缩级别增加。默认值`zstd`压缩级别为3。压缩级别设置对不使用压缩级别的连接没有影响`zstd`压缩。

    可配置的`zstd`压缩级别允许选择较少的网络流量和较高的CPU负载，而不是较多的网络流量和较低的CPU负载。较高的压缩级别可以减少网络拥塞，但额外的CPU负载可能会降低服务器性能。

#### 配置旧连接压缩

在MySQL 8.0.18之前，以下配置参数可用于控制连接压缩：

-   客户端程序支持[`--压缩`](connection-options.html#option_general_compress)命令行选项，指定与服务器的连接使用压缩。

-   对于使用MySQL C API的程序，启用`MYSQL_OPT_COMPRESS`选择[`mysql_选项（）`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-options.html)函数指定与服务器的连接使用压缩。

-   对于源/副本复制，启用系统变量[`副本压缩协议`](replication-options-replica.html#sysvar_replica_compressed_protocol)（来自MySQL 8.0.26）或[`slave_压缩_协议`](replication-options-replica.html#sysvar_slave_compressed_protocol)（在MySQL 8.0.26之前）指定对到源的副本连接使用压缩。

    在每种情况下，当指定使用压缩时，连接使用`兹利布`如果双方都允许，则使用压缩算法，否则返回到未压缩的连接。

    从MySQL 8.0.18开始，刚才描述的压缩参数变成了遗留参数，这是因为引入了额外的压缩参数，以便对中描述的连接压缩进行更多控制[配置连接压缩](connection-compression-control.html#connection-compression-configuration).MySQL Shell是一个例外，其中[`--压缩`](https://dev.mysql.com/doc/mysql-shell/8.0/en/mysqlsh.html#option_mysqlsh_compress)命令行选项保持当前状态，可用于请求压缩，而无需选择压缩算法。有关MySQL外壳的连接压缩控制的信息，请参阅[使用压缩连接](https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-compressed-connections.html).

    传统压缩参数与较新的参数交互，其语义变化如下：

-   遗产的意义[`--压缩`](connection-options.html#option_general_compress)选择取决于[`--压缩算法`](connection-options.html#option_general_compression-algorithms)具体规定如下：

    -   什么时候[`--压缩算法`](connection-options.html#option_general_compression-algorithms)没有具体说明，[`--压缩`](connection-options.html#option_general_compress)相当于指定客户端算法集`zlib，未压缩`.

    -   什么时候[`--压缩算法`](connection-options.html#option_general_compression-algorithms)是指定的，[`--压缩`](connection-options.html#option_general_compress)相当于指定一组`兹利布`完整的客户端算法集是`兹利布`加上[`--压缩算法`](connection-options.html#option_general_compression-algorithms).例如，两者都有[`--压缩`](connection-options.html#option_general_compress)和[`--压缩算法=zlib，zstd`](connection-options.html#option_general_compression-algorithms)，允许的算法集为`兹利布`加`zlib，zstd`; 就是，`zlib，zstd`.两者都有[`--压缩`](connection-options.html#option_general_compress)和[`--压缩算法=zstd，未压缩`](connection-options.html#option_general_compression-algorithms)，允许的算法集为`兹利布`加`zstd，未压缩`; 就是，`zlib，zstd，未压缩`.

-   遗产之间也会发生相同类型的交互`MYSQL_OPT_COMPRESS`选项和`MYSQL_OPT_压缩算法`选择[`mysql_选项（）`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-options.html)C API函数。

-   如果[`副本压缩协议`](replication-options-replica.html#sysvar_replica_compressed_protocol)或[`slave_压缩_协议`](replication-options-replica.html#sysvar_slave_compressed_protocol)系统变量已启用，它优先于`掌握压缩算法`以及与源使用的连接`兹利布`如果源和副本都允许该算法，则进行压缩。如果[`副本压缩协议`](replication-options-replica.html#sysvar_replica_compressed_protocol)或[`slave_压缩_协议`](replication-options-replica.html#sysvar_slave_compressed_protocol)已禁用，则`掌握压缩算法`应用。

笔记

从MySQL 8.0.18开始，旧版压缩控制参数已被弃用；预计它将在MySQL的未来版本中被删除。

#### 监视连接压缩

这个[`压缩`](server-status-variables.html#statvar_Compression)状态变量为`在…上`或`关`指示当前连接是否使用压缩。

这个[**mysql**](mysql.html)客户`\地位`命令显示一行，其中`协议：压缩`如果为当前连接启用了压缩。如果该行不存在，则连接未压缩。

从8.0.14开始，MySQL外壳`\地位`命令显示`压缩：`上面写着`残废`或`启用`指示连接是否被压缩。

从MySQL 8.0.18开始，这些额外的信息源可用于监控连接压缩：

-   要监视客户端连接使用的压缩，请使用[`压缩算法`](server-status-variables.html#statvar_Compression_algorithm)和[`压缩级`](server-status-variables.html#statvar_Compression_level)状态变量。对于当前连接，它们的值分别表示压缩算法和压缩级别。

-   要确定服务器配置为允许传入连接的压缩算法，请检查[`协议压缩算法`](server-system-variables.html#sysvar_protocol_compression_algorithms)系统变量。

-   对于源/副本复制连接，配置的压缩算法和压缩级别可从多个源获得：

    -   性能模式[`复制\连接\配置`](performance-schema-replication-connection-configuration-table.html)桌子上有`压缩算法`和`ZSTD_压缩_级别`柱。

    -   这个`mysql。奴隶主信息`系统表`掌握压缩算法`和`主级压缩级`柱。如果`主人信息`文件存在时，它也包含这些值的行。
