与服务器的连接可以使用客户端和服务器之间流量的压缩来减少通过连接发送的字节数。默认情况下,连接是未压缩的,但如果服务器和客户端就相互允许的压缩算法达成一致,则可以压缩连接。
压缩连接起源于客户端,但会影响客户端和服务器端的 CPU 负载,因为双方都执行压缩和解压缩操作。由于启用压缩会降低性能,因此其优势主要体现在网络带宽较低、网络传输时间主导压缩和解压缩操作的成本以及结果集较大时。
本节介绍可用的压缩控制配置参数以及可用于监控压缩使用的信息源。它适用于经典 MySQL 协议连接。
压缩控制适用于客户端程序和参与源/副本复制或组复制的服务器与服务器的连接。压缩控制不适用于 FEDERATED
表的连接。在下面的讨论中,“客户端连接”是指来自任何支持压缩的源与服务器的连接,除非上下文指示了特定的连接类型。
与 MySQL 服务器实例的 X 协议连接支持压缩,但 X 协议连接的压缩独立于此处描述的经典 MySQL 协议连接的压缩运行,并且是单独控制的。有关 X 协议连接压缩的信息,请参阅 第 22.5.5 节,“使用 X 插件进行连接压缩”。
以下配置参数可用于控制连接压缩:
protocol_compression_algorithms
系统变量配置服务器允许传入连接使用的压缩算法。--compression-algorithms
和--zstd-compression-level
命令行选项配置允许的压缩算法和这些客户端程序的zstd
压缩级别:mysql、mysqladmin、mysqlbinlog、mysqlcheck、mysqldump、mysqlimport、mysqlshow、mysqlslap 和 mysqltest。MySQL Shell 也提供这些命令行选项。mysql_options()
函数的MYSQL_OPT_COMPRESSION_ALGORITHMS
和MYSQL_OPT_ZSTD_COMPRESSION_LEVEL
选项配置允许的压缩算法和使用 MySQL C API 的客户端程序的zstd
压缩级别。CHANGE REPLICATION SOURCE TO
语句的SOURCE_COMPRESSION_ALGORITHMS
和SOURCE_ZSTD_COMPRESSION_LEVEL
选项配置允许的压缩算法和参与源/副本复制的副本服务器的zstd
压缩级别。当新成员加入组并连接到捐赠者时,
group_replication_recovery_compression_algorithms
和group_replication_recovery_zstd_compression_level
系统变量配置组复制恢复连接的允许压缩算法和zstd
压缩级别。
启用指定压缩算法的配置参数是字符串值,并采用一个或多个以逗号分隔的压缩算法名称列表(以任意顺序排列),从以下项中选择(不区分大小写):
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
要将副本配置为使用
zlib
或zstd
连接(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 的连接压缩控制的信息,请参阅 使用压缩连接。
传统压缩参数与较新参数相互作用,其语义更改如下:
传统
--compress
选项的含义取决于是否指定了--compression-algorithms
:如果未指定
--compression-algorithms
,则--compress
等效于指定客户端算法集zlib,uncompressed
。如果指定了
--compression-algorithms
,则--compress
等效于指定算法集zlib
,并且完整的客户端算法集是zlib
加上--compression-algorithms
指定的算法的并集。例如,使用--compress
和--compression-algorithms=zlib,zstd
,允许的算法集是zlib
加上zlib,zstd
,即zlib,zstd
。使用--compress
和--compression-algorithms=zstd,uncompressed
,允许的算法集是zlib
加上zstd,uncompressed
,即zlib,zstd,uncompressed
。
传统
MYSQL_OPT_COMPRESS
选项与mysql_options()
C API 函数的MYSQL_OPT_COMPRESSION_ALGORITHMS
选项之间也存在相同类型的交互。如果启用了
replica_compressed_protocol
系统变量,则它优先于SOURCE_COMPRESSION_ALGORITHMS
,并且如果源和副本都允许该算法,则与源的连接将使用zlib
压缩。如果replica_compressed_protocol
被禁用,则应用SOURCE_COMPRESSION_ALGORITHMS
的值。
Compression
状态变量为 ON
或 OFF
,表示当前连接是否使用压缩。
mysql 客户端 \status
命令显示一行 Protocol: Compressed
,如果为当前连接启用了压缩。如果该行不存在,则连接未压缩。
MySQL Shell \status
命令显示一行 Compression:
,其中包含 Disabled
或 Enabled
,表示连接是否已压缩。
以下附加信息源可用于监控连接压缩:
要监控客户端连接使用的压缩,请使用
Compression_algorithm
和Compression_level
状态变量。对于当前连接,它们的值分别表示压缩算法和压缩级别。要确定服务器配置为允许传入连接使用哪些压缩算法,请检查
protocol_compression_algorithms
系统变量。对于源/副本复制连接,配置的压缩算法和压缩级别可从多个来源获得:
Performance Schema
replication_connection_configuration
表具有COMPRESSION_ALGORITHMS
和ZSTD_COMPRESSION_LEVEL
列。mysql.slave_master_info
系统表具有Master_compression_algorithms
和Master_zstd_compression_level
列。如果master.info
文件存在,则它也包含这些值的对应行。