文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  连接压缩控制

6.2.8 连接压缩控制

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

压缩连接起源于客户端,但会影响客户端和服务器端的 CPU 负载,因为双方都执行压缩和解压缩操作。由于启用压缩会降低性能,因此其优势主要体现在网络带宽较低、网络传输时间主导压缩和解压缩操作的成本以及结果集较大时。

本节介绍可用的压缩控制配置参数以及可用于监控压缩使用的信息源。它适用于经典 MySQL 协议连接。

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

注意

与 MySQL 服务器实例的 X 协议连接支持压缩,但 X 协议连接的压缩独立于此处描述的经典 MySQL 协议连接的压缩运行,并且是单独控制的。有关 X 协议连接压缩的信息,请参阅 第 22.5.5 节,“使用 X 插件进行连接压缩”

配置连接压缩

以下配置参数可用于控制连接压缩:

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

  • 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未压缩 连接,请像这样调用它

    mysql --compression-algorithms=zlib,uncompressed
  • 要将副本配置为使用 zlibzstd 连接(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,最后是 未压缩。如果双方找不到共同的算法,则连接尝试失败。

由于双方必须就压缩算法达成一致,并且由于 未压缩 是一个不一定允许的算法值,因此不一定会回退到未压缩的连接。例如,如果服务器配置为允许 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 的连接压缩控制的信息,请参阅 使用压缩连接

传统压缩参数与较新参数相互作用,其语义更改如下:

监控连接压缩

Compression 状态变量为 ONOFF,表示当前连接是否使用压缩。

mysql 客户端 \status 命令显示一行 Protocol: Compressed,如果为当前连接启用了压缩。如果该行不存在,则连接未压缩。

MySQL Shell \status 命令显示一行 Compression:,其中包含 DisabledEnabled,表示连接是否已压缩。

以下附加信息源可用于监控连接压缩:

  • 要监控客户端连接使用的压缩,请使用 Compression_algorithmCompression_level 状态变量。对于当前连接,它们的值分别表示压缩算法和压缩级别。

  • 要确定服务器配置为允许传入连接使用哪些压缩算法,请检查 protocol_compression_algorithms 系统变量。

  • 对于源/副本复制连接,配置的压缩算法和压缩级别可从多个来源获得:

    • Performance Schema replication_connection_configuration 表具有 COMPRESSION_ALGORITHMSZSTD_COMPRESSION_LEVEL 列。

    • mysql.slave_master_info 系统表具有 Master_compression_algorithmsMaster_zstd_compression_level 列。如果 master.info 文件存在,则它也包含这些值的对应行。