一种简单的mysql数据压缩方案

方案

业务中某张表存储的数据量较大,导致磁盘飞速增长
于是需要找到一种方案来减小线上数据库的占用量

业务使用的数据库为mysql数据库,InnoDB引擎
故可以考虑使用InnoDB引擎自带的压缩方案

教程

1.查询表原来所占的空间

1
2
3
select concat(round(sum(data_length/1024/1024),2),'MB') as data 
from information_schema.tables
where table_schema='数据库名' AND table_name = '表名';

2.设置压缩

1
2
SET GLOBAL innodb_file_per_table=1;
SET GLOBAL innodb_file_format=Barracuda;

3.创建支持压缩的表或将已存在的表压缩

1
2
3
4
5
-- 创建支持压缩的表
CREATE TABLE 表名 (字段名 INT PRIMARY KEY,content varchar(255))
ROW_FORMAT=COMPRESSEDKEY_BLOCK_SIZE=8;
-- 压缩已存在的表
ALTER TABLE 表名 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;

其中KEY_BLOCK_SIZE可以填写1,2,4等,数字越小压缩比例越高,但是读取的时候cpu也会相应的消耗变高

后记

在测试环境,一张660mb的表被压缩到了85mb,压缩比例高到87%,耗时36s
这是因为导致大量数据的字段保存着一个非常庞大的json,这个json中有非常多的相同的字符串
压缩比例的高低有一部分原因是取决于被压缩的内容的重复程度