服务器的连接可以对客户端和服务器之间的流量进行压缩,以减少通过连接发送的字节数。默认情况下,连接是未压缩的,但是如果服务器和客户端就相互允许的压缩算法达成一致,则可以压缩连接。
压缩连接起源于客户端,但会影响客户端和服务器端的CPU负载,因为双方都执行压缩和解压缩操作。因为启用压缩会降低性能,所以其好处主要是在网络带宽较低时出现的,网络传输时间主导着压缩和解压缩操作的成本,结果集很大。
本节描述了可用的压缩控制配置参数和可用于监视压缩使用的信息源。它适用于经典的MySQL协议连接。
压缩控制适用于客户端程序以及参与源/副本复制或组复制的服务器与服务器的连接。压缩控制不适用于FEDERATED表的连接。在以下讨论中,“客户端连接”是到服务器的连接的简写,该连接源自支持压缩的任何源,除非上下文指示特定的连接类型。
注意
与MySQL Server实例的X协议连接支持MySQL 8.0.19中的压缩,但是X协议连接的压缩独立于此处所述的经典MySQL协议连接的压缩而独立运行,并且是单独控制的。有关X协议连接压缩的信息,请参见 第20.5.5节“使用X插件进行连接压缩”。
配置连接压缩
从MySQL 8.0.18开始,这些配置参数可用于控制连接压缩:
- 所述
protocol_compression_algorithms系统变量配置的压缩算法服务器允许传入连接。 - 的
--compression-algorithms和--zstd-compression-level命令行选项配置允许压缩算法和zstd为这些客户端程序压缩级别:MySQL的, 中mysqladmin, mysqlbinlog可以, mysqlcheck的,mysqldump的, 的mysqlimport, mysqlpump,mysqlshow, mysqlslap,和 mysqltest,和 mysql_upgrade。MySQL Shell还从8.0.20版本开始提供这些命令行选项。 - 该 函数的
MYSQL_OPT_COMPRESSION_ALGORITHMS和MYSQL_OPT_ZSTD_COMPRESSION_LEVEL选项为使用MySQL C API的客户端程序mysql_options()配置允许的压缩算法和zstd压缩级别。 - 语句 的
MASTER_COMPRESSION_ALGORITHMS和MASTER_ZSTD_COMPRESSION_LEVEL选项为参与源/副本复制的副本服务器CHANGE MASTER TO配置允许的压缩算法和zstd压缩级别。 - 当新成员加入组并连接到捐助者时 ,
group_replication_recovery_compression_algorithm和group_replication_recovery_zstd_compression_level变量会zstd为组复制恢复连接配置允许的压缩算法和压缩级别。
启用指定压缩算法的配置参数是字符串值,并采用一个或多个以逗号分隔的压缩算法名称的列表,这些名称可以从以下各项中选择(不区分大小写),顺序为任意顺序:
zlib:允许使用zlib压缩算法的连接 。zstd:允许使用zstd压缩算法(zstd 1.3)的连接。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。请参见 第13.7.6.1节“变量分配的SET语法”。 -
要仅允许使用
zstd压缩的传入连接,请 在启动时配置服务器,如下所示:[mysqld] protocol_compression_algorithms=zstd或者,在运行时进行更改:
SET PERSIST protocol_compression_algorithms='zstd'; -
要允许mysql客户端启动
zlib或uncompressed连接,请像这样调用它:mysql --compression-algorithms=zlib,uncompressed -
要将副本配置为使用
zlib或zstd连接连接到源 ,连接的压缩级别为7zstd,请使用以下CHANGE MASTER TO语句:CHANGE MASTER TO MASTER_COMPRESSION_ALGORITHMS = 'zlib,zstd', MASTER_ZSTD_COMPRESSION_LEVEL = 7;假定
slave_compressed_protocol由于配置传统连接压缩中所述的原因,系统变量被禁用 。
为了成功建立连接,连接双方必须在相互允许的压缩算法上达成共识。该算法协商过程中尝试使用 zlib,然后zstd,然后 uncompressed。如果双方都找不到通用算法,则连接尝试将失败。
因为双方必须在压缩算法上达成共识,并且由于uncompressed不是必须允许的算法值,所以不一定会发生未压缩连接的回退。例如,如果将服务器配置为允许,zstd而将客户端配置为允许 zlib,uncompressed,则客户端根本无法连接。在这种情况下,双方都没有通用的算法,因此连接尝试将失败。
允许指定zstd压缩级别的配置参数 采用1到22之间的整数值,其中较大的值表示压缩级别增加。默认zstd压缩级别为3。压缩级别设置对不使用zstd压缩的连接无效。
可配置的zstd压缩级别使您可以在较少的网络流量和较高的CPU负载与较多的网络流量和较低的CPU负载之间进行选择。较高的压缩级别可减少网络拥塞,但额外的CPU负载可能会降低服务器性能。
配置旧版连接压缩
在MySQL 8.0.18之前,这些配置参数可用于控制连接压缩:
- 客户端程序支持
--compress命令行选项,以指定对服务器连接的压缩方式。 - 对于使用MySQL C API的程序,启用
MYSQL_OPT_COMPRESS该mysql_options()功能的 选项可 指定对服务器连接的压缩方式。 - 对于源/副本复制,启用
slave_compressed_protocol系统变量可指定对源的副本连接使用压缩。
在每种情况下,当指定使用zlib压缩时,如果双方都允许,则连接使用压缩算法,否则退回到未压缩的连接。
从MySQL 8.0.18开始,刚介绍的压缩参数变成了遗留参数,这是由于在配置连接压缩中介绍了为更好地控制连接压缩而引入的附加压缩参数 。MySQL Shell是一个例外,其中的 --compress命令行选项保持最新状态,可用于请求压缩而无需选择压缩算法。有关MySQL Shell的连接压缩控件的信息,请参见 使用压缩的连接。
旧的压缩参数与更新的参数交互,其语义变化如下:
- legacy
--compress选项的含义 取决于是否--compression-algorithms指定:- 当
--compression-algorithms没有指定,--compress相当于指定一个客户端算法组zlib,uncompressed。 - 当
--compression-algorithms指定时,--compress相当于指定的算法集合zlib和全客户端算法集的并集zlib加上指定的算法--compression-algorithms。例如,与--compress和一起--compression-algorithms=zlib,zstd,允许算法集为zlibpluszlib,zstd; 即zlib,zstd。如果同时使用--compress和--compression-algorithms=zstd,uncompressed,则允许算法集为zlibpluszstd,uncompressed;即zlib,zstd,uncompressed。
- 当
- 旧
MYSQL_OPT_COMPRESS选项与C API函数的MYSQL_OPT_COMPRESSION_ALGORITHMS选项之间会发生相同类型的交互mysql_options()。 - 如果
slave_compressed_protocol启用了 系统变量,则优先级高,MASTER_COMPRESSION_ALGORITHMS并且zlib如果源和副本都允许该算法,则 到源的连接将使用压缩。如果slave_compressed_protocol禁用,则应用值MASTER_COMPRESSION_ALGORITHMS。
注意
从MySQL 8.0.18开始不推荐使用旧版压缩控制参数;希望在将来的MySQL版本中将其删除。
监视连接压缩
的Compression状态变量是ON或OFF以指示当前连接是否使用压缩。
在MySQL的客户端\status 命令显示一行,说Protocol: Compressed如果压缩当前连接启用。如果该行不存在,则说明连接未压缩。
从8.0.14开始,MySQL Shell\status 命令显示Compression:一行,显示Disabled或Enabled 指示连接是否已压缩。
从MySQL 8.0.18开始,这些附加信息源可用于监视连接压缩:
- 要监视用于客户端连接的压缩,请使用
Compression_algorithm和Compression_level状态变量。对于当前连接,它们的值分别指示压缩算法和压缩级别。 - 要确定服务器配置为允许传入连接的压缩算法,请检查
protocol_compression_algorithms系统变量。 - 对于源/副本复制连接,可从多个来源获得配置的压缩算法和压缩级别:
- 性能架构
replication_connection_configuration表具有COMPRESSION_ALGORITHMS和ZSTD_COMPRESSION_LEVEL列。 - 该
mysql.slave_master_info系统表,Master_compression_algorithms和Master_zstd_compression_level列。如果master.info文件存在,它也包含这些值的行。
- 性能架构




