无痛苦的 SQLite 压缩:sqlite-zstd 的魔力
1,681 星标
想象一下:你的应用使用的 SQLite 数据库已经膨胀到数 GB,备份耗时漫长,I/O 操作拖慢了所有性能。听起来很熟悉?sqlite-zstd 扩展提供了一个优雅的解决方案——在保留随机数据访问的同时实现行级压缩。
这是什么?
sqlite-zstd 是一个用 Rust 编写的 SQLite 扩展,使用 Zstandard(zstd)算法实现透明的行级数据压缩。与一次性压缩整个数据库不同,这种方法能够:
- 节省高达 80% 的空间(根据作者的说法)
- 保留数据的随机访问能力
- 最大限度减少性能影响

适用人群
该项目特别适合以下场景:
- 移动开发者,每兆字节都至关重要
- 拥有大量日志或历史数据的服务
- 在 SQLite 中处理 JSON/文本数据的应用
- 存储空间有限的嵌入式系统开发者
主要特性
1. 透明压缩
SELECT zstd_enable_transparent('{"table": "logs", "column": "data", "compression_level": 19}')
之后,对 logs 表的所有操作都会自动压缩/解压缩 data 列中的数据。你的代码甚至不会注意到这些变化!
2. 增量维护
SELECT zstd_incremental_maintenance(60, 0.5);
此函数允许你逐步压缩数据,而无需长时间锁定数据库。你可以指定工作时间以及为其他操作预留的时间。
3. 字典支持
该项目可以创建和使用字典以获得更好的压缩效果:
SELECT zstd_train_dict(data, 100000, 1000) FROM logs
这对于结构化数据(例如,带有重复键的 JSON)特别有效。
底层原理
- 为每个可压缩表创建一个隐藏的
_table_zstd表 - 原始表变成一个视图,透明地压缩/解压缩数据
- INSERT/UPDATE 时,数据自动压缩
- SELECT 时,数据解压缩
实际应用场景
示例 1:应用日志
# Python пример с Datasette
import sqlite3
import sqlite_zstd
conn = sqlite3.connect('logs.db')
sqlite_zstd.load(conn)
# Включаем сжатие для колонки с логами
conn.execute("""
SELECT zstd_enable_transparent('{"table": "logs", "column": "message"}')
""")
示例 2:存储 JSON API 响应
// Rust пример
let conn: rusqlite::Connection;
sqlite_zstd::load(&conn)?;
conn.execute(
"SELECT zstd_enable_transparent('{\"table\": \"cache\", \"column\": \"json\"}')',
[],
)?;
局限性
- 尚未达到生产就绪状态(根据作者的观点)
- 不支持 ATTACH 压缩数据库
- DDL 操作支持有限
- 仅适用于 TEXT/BLOB 列
sqlite-zstd 的优势:
✅ 减少 SQLite 数据库大小的简单解决方案 ✅ 对现有代码的改动最小 ✅ 灵活控制压缩过程
在以下情况下可以尝试:
- 你的 SQLite 数据库已经膨胀到不合理的规模
- 需要存储大量文本/二进制数据
- 准备好进行实验(但要做好备份!)
该项目正在积极开发中,已在 GitHub 上获得了近 1.6k 的星标。想要节省空间?现在正是集成 sqlite-zstd 的最佳时机!
相关项目