与服务器的连接可以对客户端和服务器之间的流量使用压缩,以减少通过连接发送的字节数。默认情况下,连接是未压缩的,但如果服务器和客户端就相互允许的压缩算法达成一致,则可以进行压缩。
压缩连接源自客户端,但会影响客户端和服务器端的 CPU 负载,因为双方都执行压缩和解压缩操作。因为启用压缩会降低性能,所以它的好处主要出现在网络带宽较低、网络传输时间占压缩和解压缩操作成本的主要部分以及结果集很大的情况下。
本节描述可用的压缩控制配置参数和可用于监视压缩使用的信息源。它适用于经典的 MySQL 协议连接。
压缩控制适用于客户端程序和参与源/副本复制或组复制的服务器与服务器的连接。压缩控制不适用于FEDERATED
表的连接。在下面的讨论中,“客户端连接”是从支持压缩的任何来源到服务器的连接的简写,除非上下文指示特定的连接类型。
与 MySQL 服务器实例的 X 协议连接支持来自 MySQL 8.0.19 的压缩,但 X 协议连接的压缩独立于此处描述的经典 MySQL 协议连接的压缩运行,并且单独控制。有关 X 协议连接压缩的信息,请参阅 第 20.5.5 节,“使用 X 插件进行连接压缩”。
从 MySQL 8.0.18 开始,这些配置参数可用于控制连接压缩:
protocol_compression_algorithms
系统变量配置服务器允许传入连接的压缩算法 。和 命令行选项为这些客户端程序配置允许的压缩算法和压缩级别
--compression-algorithms
:mysql、 mysqladmin、 mysqlbinlog、 mysqlcheck、mysqldump、 mysqlimport、 mysqlpump、mysqlshow、 mysqlslap、 mysqltest和 mysql_upgrade。MySQL Shell 在其 8.0.20 版本中也提供了这些命令行选项。--zstd-compression-level
zstd
该函数的
MYSQL_OPT_COMPRESSION_ALGORITHMS
和MYSQL_OPT_ZSTD_COMPRESSION_LEVEL
选项为使用 MySQL C API 的客户端程序mysql_options()
配置允许的压缩算法和 压缩级别。zstd
语句 的
MASTER_COMPRESSION_ALGORITHMS
和MASTER_ZSTD_COMPRESSION_LEVEL
选项为参与源/副本复制的副本服务器配置允许的压缩算法和压缩级别。从 MySQL 8.0.23 开始,使用语句和选项 and 代替。CHANGE MASTER TO
zstd
CHANGE REPLICATION SOURCE TO
SOURCE_COMPRESSION_ALGORITHMS
SOURCE_ZSTD_COMPRESSION_LEVEL
当 新成员加入组并连接到捐赠者时 ,
group_replication_recovery_compression_algorithms
和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
要将副本配置为使用or connections 连接到源 ,zstd
连接的压缩级别为 7zstd
,请使用CHANGE REPLICATION SOURCE TO
语句(来自 MySQL 8.0.23)或CHANGE MASTER TO
语句(MySQL 8.0.23 之前):CHANGE REPLICATION SOURCE TO SOURCE_COMPRESSION_ALGORITHMS = 'zlib,zstd', SOURCE_ZSTD_COMPRESSION_LEVEL = 7;
这假设
replica_compressed_protocol
orslave_compressed_protocol
系统变量被禁用,原因在 配置传统连接压缩中描述。
为了成功建立连接,连接的双方必须就相互允许的压缩算法达成一致。算法协商过程尝试使用
zlib
,然后zstd
,然后
uncompressed
。如果双方找不到共同的算法,则连接尝试失败。
因为双方必须就压缩算法达成一致,并且因为uncompressed
是不一定允许的算法值,所以不一定会回退到未压缩的连接。例如,如果服务器配置为 permitzstd
而客户端配置为 permit
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()
指定对服务器连接使用压缩。对于源/副本复制,启用系统变量
replica_compressed_protocol
(从 MySQL 8.0.26 开始)或slave_compressed_protocol
(在 MySQL 8.0.26 之前)指定对与源的副本连接使用压缩。
在每种情况下,当指定使用压缩时,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
,允许的算法集是zlib
pluszlib,zstd
;也就是说,zlib,zstd
。对于--compress
和--compression-algorithms=zstd,uncompressed
,允许的算法集是zlib
pluszstd,uncompressed
;也就是说,zlib,zstd,uncompressed
。
MYSQL_OPT_COMPRESS
遗留选项和 C API 函数 的MYSQL_OPT_COMPRESSION_ALGORITHMS
选项 之间会发生相同类型的交互 。mysql_options()
如果启用了
replica_compressed_protocol
or 系统变量,则 如果源和副本都允许该算法slave_compressed_protocol
,则它优先于MASTER_COMPRESSION_ALGORITHMS
并且与源的连接使用压缩。zlib
如果replica_compressed_protocol
或slave_compressed_protocol
被禁用,则MASTER_COMPRESSION_ALGORITHMS
应用的值。
从 MySQL 8.0.18 开始,旧的压缩控制参数已被弃用;希望在未来的 MySQL 版本中将其删除。
Compression
status 变量是ON
or表示
当前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
系统变量。对于源/副本复制连接,配置的压缩算法和压缩级别可从多个源获得:
Performance Schema
replication_connection_configuration
表有COMPRESSION_ALGORITHMS
和ZSTD_COMPRESSION_LEVEL
列。系统
mysql.slave_master_info
表有Master_compression_algorithms
和Master_zstd_compression_level
列。如果该master.info
文件存在,它也包含这些值的行。