如何压缩 MySQL 中的列?
How to compress columns in MySQL?
我有一个 table 存储电子邮件通信。每当有人
回复,整个踪迹也被包含并保存到
数据库(我需要这样,因为应用程序的数量
级别更改以纠正太高的级别)。
mail
文本列的大小为 10000
。但是,我在存储文本时遇到的问题不止于此。由于我不确定,可以发生多少对应关系,我不知道该列的一个好的数字。
引擎是InnoDB
。我可以在 MySQL
中使用某种列压缩技术来避免增加列的大小吗?
而且,如果我继续将 varchar 列增加到比方说 20000 会怎么样。table 有大约 200 万条记录。这会是一件好事吗?
您可能正在寻找 MySQL COMPRESS() and UNCOMPRESS() 函数来分别压缩数据以进行存储和检索。
只要数据不需要编辑,就可以使用归档引擎。
此答案特定于 Percona
Percona 不久前引入了压缩 列格式。您可以在 CREATE 或 ALTERs
上使用
CREATE TABLE test_compressed (
id INT NOT NULL PRIMARY KEY,
value MEDIUMTEXT COLUMN_FORMAT COMPRESSED
);
参考:https://www.percona.com/doc/percona-server/5.7/flexibility/compressed_columns.html
对我来说,使用文本数据压缩的最佳方式是使用 Percona 压缩列格式。
ALTER TABLE `tableName` MODIFY `mail` TEXT COLUMN_FORMAT COMPRESSED NOT NULL;
我在table上测试压缩用作缓存,主要存储HTML数据,大小从620MB减少到110.6MB。
我认为您应该考虑使用 TEXT 类型而不是 long VARCHAR。
数据字段与 innodb 聚集索引分开存储,它可以影响并可能提高数据库的性能。
您有几个不同的选择:
- 等待 RFE 将列压缩添加到 MySQL(参见 https://bugs.mysql.com/bug.php?id=106541)——这不太可能完成
- 使用应用程序级压缩和解压缩 - 执行此操作涉及更多工作
- 依靠 MySQL 的压缩和解压缩功能为您完成此操作(请参阅 https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_compress)- 这些并不可靠,因为它们取决于 MySQL 的编译方式(zlib或不)-而且他们很多时候都没有给出很好的结果
- 不要担心文件大小,因为磁盘 space 很便宜,只需将列类型更改为 TEXT(参见 https://dev.mysql.com/doc/refman/8.0/en/blob.html)
- 如果磁盘 space 是您主要关心的问题,通常最好的选择是将 table 更改为使用以下方式进行压缩:
ALTER TABLE t1 ROW_FORMAT = COMPRESSED;
- 对于电子邮件,这可以提供非常好的压缩,如果需要是否可以针对您的特定工作负载进行调整以实现更好的压缩(参见 https://dev.mysql.com/doc/refman/8.0/en/innodb-compression-tuning.html)
我有一个 table 存储电子邮件通信。每当有人 回复,整个踪迹也被包含并保存到 数据库(我需要这样,因为应用程序的数量 级别更改以纠正太高的级别)。
mail
文本列的大小为 10000
。但是,我在存储文本时遇到的问题不止于此。由于我不确定,可以发生多少对应关系,我不知道该列的一个好的数字。
引擎是InnoDB
。我可以在 MySQL
中使用某种列压缩技术来避免增加列的大小吗?
而且,如果我继续将 varchar 列增加到比方说 20000 会怎么样。table 有大约 200 万条记录。这会是一件好事吗?
您可能正在寻找 MySQL COMPRESS() and UNCOMPRESS() 函数来分别压缩数据以进行存储和检索。
只要数据不需要编辑,就可以使用归档引擎。
此答案特定于 Percona
Percona 不久前引入了压缩 列格式。您可以在 CREATE 或 ALTERs
上使用CREATE TABLE test_compressed (
id INT NOT NULL PRIMARY KEY,
value MEDIUMTEXT COLUMN_FORMAT COMPRESSED
);
参考:https://www.percona.com/doc/percona-server/5.7/flexibility/compressed_columns.html
对我来说,使用文本数据压缩的最佳方式是使用 Percona 压缩列格式。
ALTER TABLE `tableName` MODIFY `mail` TEXT COLUMN_FORMAT COMPRESSED NOT NULL;
我在table上测试压缩用作缓存,主要存储HTML数据,大小从620MB减少到110.6MB。
我认为您应该考虑使用 TEXT 类型而不是 long VARCHAR。 数据字段与 innodb 聚集索引分开存储,它可以影响并可能提高数据库的性能。
您有几个不同的选择:
- 等待 RFE 将列压缩添加到 MySQL(参见 https://bugs.mysql.com/bug.php?id=106541)——这不太可能完成
- 使用应用程序级压缩和解压缩 - 执行此操作涉及更多工作
- 依靠 MySQL 的压缩和解压缩功能为您完成此操作(请参阅 https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_compress)- 这些并不可靠,因为它们取决于 MySQL 的编译方式(zlib或不)-而且他们很多时候都没有给出很好的结果
- 不要担心文件大小,因为磁盘 space 很便宜,只需将列类型更改为 TEXT(参见 https://dev.mysql.com/doc/refman/8.0/en/blob.html)
- 如果磁盘 space 是您主要关心的问题,通常最好的选择是将 table 更改为使用以下方式进行压缩:
ALTER TABLE t1 ROW_FORMAT = COMPRESSED;
- 对于电子邮件,这可以提供非常好的压缩,如果需要是否可以针对您的特定工作负载进行调整以实现更好的压缩(参见 https://dev.mysql.com/doc/refman/8.0/en/innodb-compression-tuning.html)