MyCat 从 1.4 开始支持 MySQL 的压缩协议,在查询返回大的结果集和 load data 大量数据的性能提升比较明显。可以大大节省网络流量,但会消耗少量 CPU 资源。如果要启用压缩协议,则客户端、MyCat、MySQL 三者都启用才行
MyCat 可以在 server.xml 中配置 1 启用。客户端如果是 MySQL 命令行,则加参数 -C 启用压缩协议。客户端如果是 JDBC 则在 JDBC 的 url 上加上参数 useCompression=true,例如 : jdbc:mysql://127.0.0.1:8066/base?useCompression=true
压缩协议属于 MySQL 通讯协议的一部分,要启用压缩协议传输功能,前提条件客户端和服务端都必须要支持zlib 算法。MySQL 起始握手,先由 server 发起,client 分析并回应自已同意的特性,然后双方依照这些特性处理数据包。通信时是否采用压缩会改变数据包的字节变化。客户端的特性在首个回应 (既握手包) 服务器中体现,如 : 是否开启压缩、字符集、用户登录信息等
1> 未采用压缩时,客户端向服务器发送的包格式 :
格式 : 3*byte,1*byte,1*byte,n*byte
表示 : 消息长度,包序号,请求类型,请求内容
2> 采用压缩后,客户端向服务器发送的包格式 :
格式 : 3*byte,1*byte,3*byte,n*byte
表示 : 消息长度,包序号,压缩包大小,压缩包内容
当压缩包大小为 0x00 时,表示当前包未采用压缩,则 n*byte 内容为原协议包内容
当压缩包大小大于 0x00 时,表示当前包已采用 zlib 压缩,则 n*byte 内容,先解压缩,解压后内容为原协议包内容
mysql 内部有一个约定,如果原协议包小于 50 字节时,对内容不压缩而保持原貌的方式,而 mysql 此举是为了减少 CPU 性能开销。 mysql 的压缩协议对原协议是透明的,也就是说一个压缩包里可能包括一个或多个原协议包,甚至可能包括一些不完整的原协议包在内。也就是一个原协议包可能会被拆分到 2 个压缩包中