>_ DevTrendszh

语言

首页

语言

板块

前端 后端 移动端 DevOps AI / ML 游戏开发 区块链 安全
Rust

无痛苦的 SQLite 压缩:sqlite-zstd 的魔力

1,681 星标

想象一下:你的应用使用的 SQLite 数据库已经膨胀到数 GB,备份耗时漫长,I/O 操作拖慢了所有性能。听起来很熟悉?sqlite-zstd 扩展提供了一个优雅的解决方案——在保留随机数据访问的同时实现行级压缩。

这是什么?

sqlite-zstd 是一个用 Rust 编写的 SQLite 扩展,使用 Zstandard(zstd)算法实现透明的行级数据压缩。与一次性压缩整个数据库不同,这种方法能够:

  • 节省高达 80% 的空间(根据作者的说法)
  • 保留数据的随机访问能力
  • 最大限度减少性能影响

Size comparison

适用人群

该项目特别适合以下场景:

  1. 移动开发者,每兆字节都至关重要
  2. 拥有大量日志或历史数据的服务
  3. 在 SQLite 中处理 JSON/文本数据的应用
  4. 存储空间有限的嵌入式系统开发者

主要特性

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)特别有效。

底层原理

  1. 为每个可压缩表创建一个隐藏的 _table_zstd
  2. 原始表变成一个视图,透明地压缩/解压缩数据
  3. INSERT/UPDATE 时,数据自动压缩
  4. 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 的最佳时机!

相关项目