什么是COMPRESSED INNODB表
COMPRESSED是MySQL 5.5中InnoDB存储引擎支持的一种表格式,它通过对数据页进行压缩来减少表的存储空间占用。这种格式的表会将数据页压缩后存储到磁盘,读取时再进行解压,适合存储大量文本、BLOB等可压缩数据的场景。

COMPRESSED INNODB表的创建方式
创建新表时指定压缩格式
在创建表的时候,可以通过ROW_FORMAT参数指定为COMPRESSED,同时可以设置压缩的块大小,可选的块大小有1KB、2KB、4KB、8KB、16KB,默认和InnoDB页大小一致,通常是16KB。
-- 创建COMPRESSED格式的InnoDB表,指定压缩块大小为8KB
CREATE TABLE compressed_test (
id INT PRIMARY KEY AUTO_INCREMENT,
content TEXT
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
修改已有表为压缩格式
如果已经存在普通格式的InnoDB表,可以通过ALTER TABLE语句修改表的行格式为COMPRESSED,注意修改过程会锁表并且重建表,大表操作需要提前评估影响。
-- 将已有表修改为COMPRESSED格式,压缩块大小为4KB ALTER TABLE existing_table ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4;
COMPRESSED INNODB表的配置要求
要使用COMPRESSED格式的InnoDB表,需要确保MySQL 5.5的InnoDB配置满足以下条件:
- innodb_file_per_table参数需要开启,因为COMPRESSED表需要使用独立的表空间文件
- innodb_file_format参数需要设置为Barracuda,这是支持COMPRESSED格式的InnoDB文件格式
可以通过以下SQL语句查看和修改相关配置:
-- 查看当前InnoDB文件格式配置 SHOW VARIABLES LIKE 'innodb_file_format'; -- 查看是否开启独立表空间 SHOW VARIABLES LIKE 'innodb_file_per_table'; -- 设置InnoDB文件格式为Barracuda SET GLOBAL innodb_file_format=Barracuda; -- 开启独立表空间 SET GLOBAL innodb_file_per_table=ON;
COMPRESSED INNODB表的优缺点
优点
- 显著减少表的存储空间占用,尤其是存储大量可压缩数据时,压缩率可以达到30%到70%
- 减少磁盘I/O次数,因为同样的数据量占用的磁盘页更少,查询时读取的页数量减少
- 适合存储归档数据、日志类数据等写入后很少修改的场景
缺点
- 写入和更新数据时需要额外的压缩和解压开销,会占用更多的CPU资源
- 压缩块大小设置不合理可能导致页分裂,反而影响性能
- 不支持使用ROW_FORMAT=COMPRESSED的同时使用表空间加密功能
使用注意事项
在使用COMPRESSED INNODB表时,需要注意以下几点:
- 压缩块大小需要根据实际数据特点调整,通常建议先测试不同块大小的压缩率和性能,再选择合适的配置
- 频繁更新的表不建议使用COMPRESSED格式,因为更新带来的解压和重新压缩开销会抵消存储和I/O的优势
- 可以通过
SHOW TABLE STATUS LIKE 'table_name'查看表的压缩相关信息,比如Data_length可以反映压缩后的数据大小
压缩效果验证示例
可以通过创建相同数据的普通表和COMPRESSED表,对比两者的存储空间占用,验证压缩效果:
-- 创建普通InnoDB表
CREATE TABLE normal_test (
id INT PRIMARY KEY AUTO_INCREMENT,
content TEXT
) ENGINE=InnoDB;
-- 插入大量测试数据
DELIMITER //
CREATE PROCEDURE insert_test_data()
BEGIN
DECLARE i INT DEFAULT 0;
WHILE i < 10000 DO
INSERT INTO normal_test(content) VALUES (REPEAT('测试压缩数据', 100));
SET i = i + 1;
END WHILE;
END //
DELIMITER ;
CALL insert_test_data();
-- 复制数据到COMPRESSED表
CREATE TABLE compressed_test_copy (
id INT PRIMARY KEY AUTO_INCREMENT,
content TEXT
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
INSERT INTO compressed_test_copy SELECT * FROM normal_test;
-- 查看两个表的大小
SHOW TABLE STATUS LIKE 'normal_test';
SHOW TABLE STATUS LIKE 'compressed_test_copy';
通过对比两个表的Data_length字段,可以直观看到COMPRESSED表的存储空间比普通表小很多。
MySQLCOMPRESSED_INNODBInnoDB表压缩数据库存储优化修改时间:2026-07-23 16:06:14