MySQL InnoDB表支持行格式压缩,压缩后的表能够显著减少磁盘空间占用,但是压缩功能也会造成一定的性能损耗,比如加重CPU的负载,降低数据库吞吐量。本文通过测试案例,来具体了解MySQL InnoDB行格式压缩的效果以及对性能的影响。
- MySQL版本:5.7.19
- 测试工具:sysbench,10张表,单张表1000w数据,32线程并发
- 测试场景:read_only,write_only,read_write
行格式压缩语法:
ALTER TABLE sbtest1 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
1. 压缩效果测试
sysbench生成10张表,每张表1000w条记录,对比压缩前后,这10张表的磁盘占用大小。
压缩前:23G
压缩后:16G
压缩之后,磁盘占用降低了30%左右。
2. CPU负载测试
测试场景 | cpu负载 | cpu占用百分比 |
---|---|---|
read_only(未压缩) | 0.49 | 25% |
read_only(压缩) | 1.28 | 30% |
write_only(未压缩) | 2.93 | 29% |
write_only(压缩) | 4.87 | 72% |
read_write(未压缩) | 1.65 | 32% |
read_write(压缩) | 2.49 | 60% |
以上测试结果可以看出,压缩对cpu的影响较大,尤其是写入场景,cpu负载和cpu占用百分比增长了1倍以上。
3. 读写性能测试
测试场景 | tps | qps | min(ms) | agv(ms) | max(ms) | 95%(ms) |
---|---|---|---|---|---|---|
read_only(未压缩) | 1221.55 | 19544.74 | 23.01 | 26.19 | 429.10 | 28.16 |
read_only(压缩) | 1134.81 | 18156.96 | 23.33 | 28.19 | 845.78 | 30.26 |
write_only(未压缩) | 2688.26 | 16129.56 | 8.23 | 11.90 | 415.46 | 19.29 |
write_only(压缩) | 1166.50 | 6998.99 | 10.46 | 27.43 | 629.40 | 44.98 |
read_write(未压缩) | 892.68 | 17853.53 | 28.71 | 35.84 | 439.47 | 46.63 |
read_write(压缩) | 634.78 | 12695.65 | 32.87 | 50.41 | 876.79 | 64.47 |
从以上测试结果可以看出,压缩对数据库tps,qps和响应时间产生较大影响,尤其是写入场景,tps,qps 降低明显,而对于只读场景,影响较小。
4. 总结:
- 行格式压缩能够明显减少磁盘空间占用,从测试结果来看,降低了30%左右,而在实际业务场景中,如果业务表含有大量字符串字段,那么压缩效果将会更加显著。
- 数据压缩在减少磁盘空间占用的同时,也会带来一些负作用,使得cpu负载和cpu使用率明显增加。
- 压缩功能会影响数据库性能,从测试结果上来看,对于写入场景的影响要明显大于只读场景。