10 万条记录改一条:文本文件 737 毫秒,数据库 0.2 毫秒
同样 10 万条数据改一条:文件 737 毫秒,数据库 0.2 毫秒。

我手上有个素材文件夹,2.3 GB、43 个视频,想备份。动手第一件事就是打包压缩,体积小一点好存。
试完发现,视频怎么压都几乎不变。最狠的那一档跑了 11 分钟,只换来 4 MB。
为了对照,我又拿一堆纯文本跑了一遍同样的流程。同一台机器、同样的命令,两边省下的比例差了 400 倍。
这台机器的盘本来就快满了,只剩 5 GB 空。2.3 GB 的包写一份就占掉一半,所以每种方式我都是跑完立刻删,一个个来。
机器两核,每种方式只跑一次,时间用 time 命令记。反复跑会让系统缓存起作用,数字反而不可比,所以一次算一次。
每一步都分两段:先用 tar(打包工具,把一堆文件装进一个箱子),再交给压缩程序(把箱子抽真空)。压缩程序试了 gzip、zstd、xz 三种。zstd 和 xz 都能调档位,档越高压得越狠,也越费时间。
视频那条实际敲的是这个(在素材目录里执行):
tar -cf - 老皮视频 \
| zstd -19 -T0 -q -o v.tar.zst19
| 做法 | 用时 | 打包后大小 | 省下 |
|---|---|---|---|
| 不压缩,只打包 | 101 秒 | 2,380,851,200 字节 | — |
| gzip | 81 秒 | 2,378,099,376 字节 | 2.7 MB(0.12%) |
| zstd 普通档 | 14 秒 | 2,377,921,641 字节 | 2.9 MB(0.12%) |
| zstd 最高档 | 661 秒 | 2,377,527,617 字节 | 3.3 MB(0.14%) |
| xz | 647 秒 | 2,376,874,076 字节 | 4.0 MB(0.17%) |
最省的是 xz:2.38 GB 变 2.376 GB,千分之二都不到,代价是 10 分 47 秒。
gzip 跑了 81 秒,省下 2.7 MB。zstd 普通档只用 14 秒,省得还比 gzip 多一点,这一档反而最划算。
不压缩那行最慢,101 秒。因为它要往盘里实打实写 2.3 GB,时间全耗在写盘上。
Markdown 就是写文章用的纯文本,没有排版文件那么大。
| 做法 | 用时 | 打包后大小 | 占原来 |
|---|---|---|---|
| 不压缩,只打包 | 0.01 秒 | 2,457,600 字节 | — |
| gzip | 0.12 秒 | 971,087 字节 | 39.5% |
| zstd 普通档 | 0.09 秒 | 927,914 字节 | 37.8% |
| zstd 最高档 | 1.03 秒 | 740,700 字节 | 30.1% |
| xz -6 | 1.02 秒 | 722,524 字节 | 29.4% |
2.2 MB 变 722 KB,1 秒完事。
还有个反直觉的地方:xz -9 和 xz -6 出来的包一模一样大,都是 722,524 字节,-9 还多花 0.1 秒。这个体量上加档没意义。
为什么差这么多?视频里存的画面本来就压过一遍,我再压,等于把抽过真空的袋子再抽一次,抽不动。文本不一样,字和字之间重复多,压缩程序找得到。
下次我就按这个走:视频目录直接 rsync 增量,不压缩;文档目录 tar 加 xz -6,解一次对 md5,然后挪到另一块盘。
同样 10 万条数据改一条:文件 737 毫秒,数据库 0.2 毫秒。
同一张照片 10 种存法,4 种把定位带出去,涂黑也白涂。
18.6 MB 字体按页面用字裁到 232.7 KB,附四个坑