我正在使用 MySQL 和 Java(标准 jdbc 连接)。
我知道我可以启用连接压缩(这样在 Java 中生成的数据在到达 MySQL 服务器之前被压缩)。还有一个选项可以启用 InnoDB 行压缩,以便到达 MySQL 的数据随后以压缩状态保存。
问题是——因为当 MySQL 从 Java 客户端接收压缩数据时,在这种情况下需要解压缩然后再次压缩——是否有可能缓解这种情况?我只是想让它以压缩状态保存并节省 CPU 周期。
您可以使用 Java 的 Deflater 类自行压缩字符串。然后将压缩产生的字节存储在二进制列中(例如 VARBINARY、BLOB、LONGBLOB)。
如果存储这种预压缩数据,则无需使用MySQL的压缩协议或压缩列。它不会被进一步压缩,只会浪费 CPU 周期。
在客户端存储你压缩过的字符串的缺点是你不能使用SQL表达式来操作原始字符串。您只能逐字存储和获取压缩字节。
你的评论:
最接近的是 JDBC URL 属性
useCompression
,但如您所知,这仅适用于网络协议,不适用于存储。
一些事情会阻止您想要的端到端压缩:
MySQL的存储引擎架构。网络协议独立于存储引擎。给定存储引擎使用的压缩算法可能与协议中使用的压缩算法不同。
SQL 查询结果集可以通过连接多个表来组合。连接表可能使用压缩或不使用压缩,甚至可能使用不同的存储引擎。
压缩在 MySQL 中或多或少一直处于试验阶段,并没有足够的需求来实现处理上述情况所暗示的组合所需的所有代码。俗话说,pull requests welcome.