日期:2026-07-17
主题:用 Rust 重写 Postgres:数据库界的 LLVM
原文:We're building Postgres in Rust. Using the LLVM of databases
来源:Turso (via Lobsters)
领域:💻 编程语言 / 🏗️ 系统工程
数据库内核重写是软件工程中最激进的决定之一。Postgres 经历了三十多年的发展,代码量超过 150 万行,核心由 C 语言书写。当 Turso 团队宣布他们正在用 Rust 构建 Postgres 兼容实现时,整个数据库社区都为之侧目。
但这个故事比标题看起来要复杂得多,也有趣得多。Turso 并非从零开始写一个 Postgres 内核——他们其实已经用 Rust 完整重写了 SQLite,而这次是将这个经过生产验证的 Rust 数据库引擎升级为「数据库界的 LLVM」:一个现代化、可插拔的核心,支持多种 SQL 方言前端编译到统一的字节码上执行。SQLite 是第一个前端,Postgres 是第二个。
Turso 最初是 SQLite 的一个完整 Rust 重写实现。它与 SQLite 文件兼容——可以直接打开和生成 SQLite 数据库文件。但它在 SQLite 的基础上增加了大量令人兴奋的特性:
REFRESH MATERIALIZED VIEWTurso 的作者 Glauber Costa 和 Pekka Enberg 拥有 Linux 内核开发十年的经验。他们将内核社区的精神带入了这个项目:代码说话、门槛高、通过努力赢得席位。目前 Turso 已经有超过 260 位贡献者,社区非常活跃。
文章揭示了一个大多数人都不知道的事实:SQLite 本质上不是一个数据库,而是一个虚拟机。
SQLite 有一个非常独特的设计——它会把 SQL 编译成自己的字节码语言,叫做 VDBE(Virtual Database Engine)。这不像 JVM 或 WASM 那样的通用语言,而是数据库专用的字节码,包含像"在 B-Tree 中查找某条记录"这样的高级操作。
Turso 继承了这一设计,但做了彻底的重构和扩展。架构如下:
SQL 语句 → 解析器 → VDBE 字节码 → 执行引擎 → 存储层
字节码层是关键创新:它将前端(SQL 方言)与后端(存储引擎)彻底解耦。任何数据库前端只需要将自己的 SQL 编译为 VDBE 字节码,就能在 Turso 引擎上运行。
这个设计不是纸上谈兵——Turso 团队真的写了一个小型 C 语言到 VDBE 的编译器,然后在浏览器中用 Turso 引擎运行了 DOOM!每一帧是一行查询结果,内存区域由 blob 读写模拟。这是一个在浏览器标签页中、没有任何服务器后端、纯数据库引擎运行的 Doom。
LLVM 的成功在于定义了清晰的中间表示(IR),将前端语言与后端目标架构解耦。任何语言只需生成 LLVM IR,就能自动获得对所有架构的支持。
Turso 的构想完全对等:
这意味着用户可以为不同的负载选择不同的 SQL 方言,而不需要更换数据库系统。更令人兴奋的是,由于 Turso 可以编译到 WASM,一个真正的 Postgres 数据库可以完全在浏览器标签页中运行,不需要任何服务器。
很多人之前尝试过将 SQLite 和 Postgres 结合起来,但通常是在查询层做翻译——把 Postgres 查询转成 SQLite 查询。这种做法有巨大的阻抗不匹配。
但 Turso 团队发现了一个关键洞察:从内部看,所有 SQL 数据库本质上都是带有索引的 B-Tree 集合。Postgres 用堆文件加独立的 B-Tree 索引,SQLite 把所有东西都聚类到 B-Tree 中——这些都是"字节在磁盘上如何排列"的差异,而不是数据库执行的基本操作有什么不同。
基于这个洞察,他们通过一个叫 pgmicro 的实验项目验证了可行性:解析 Postgres 语言为通用 AST,将 AST 编译为 Turso 的 VDBE 字节码。结果证明,Postgres 需要做的事情要么已经在 VDBE 中可表示,要么可以扩展 VDBE 来支持。
现在这个实验已经正式合并到 Turso 主线中,成为官方项目。
Turso 对 Postgres 兼容性的定位务实而清晰:
对于 Postgres 的扩展生态,Turso 已有基于 WASM 容器加载 Postgres 扩展的概念验证。虽然有一定性能开销,但可以让任意扩展在 WASM 沙箱中运行。团队认为允许任意代码执行的扩展系统本身并不是个好主意,但 WASM 方式在实践中对大多数扩展都可行。
对于 PL/pgSQL,团队更倾向于实现一个更好的替代方案,再加一个兼容层来提供 PL/pgSQL 接口。
Turso 的技术选型反映了创始人的内核背景:
团队对工程节奏的态度也值得关注。当被问及"会不会因为有严格的代码审查而比 AI 全自动生成慢"时,他们的回答是:"每项提交是慢一些。但我们不是从空白画布开始的。我们从一个已经能工作、已经被测试到半死、已经和 Postgres 共享了大部分内核的数据库起步。慢而正确正是为什么三年后我们还会在这里、还会是正确的。数据库不是用来快速迭代、随意破坏的地方。"
Turso 正在做的事情,不仅仅是又一次数据库重写。他们正在构建一个范式——数据库界的 LLVM。
这个愿景的深远意义在于:它打破了"一个数据库一种查询语言"的紧耦合。开发者可以为不同的场景选择最合适的 SQL 方言,而不需要管理多个数据库系统。Postgres 兼容性让这一愿景拥有了坚实的生态基础,而 Turso 引擎在可靠性上的投入(形式化验证、确定性测试)让它在生产环境中值得信赖。
当然,挑战依然巨大。Postgres 三十年的 SQL 方言实现包含了无数边缘案例,从零实现的工作量不容小觑。但 Turso 团队的优势在于:他们不是从零开始——他们从一个经过生产验证的 Rust 数据库引擎出发,核心架构已经就绪。
对于 Rust 语言来说,这也是一个重要的里程碑。如果 Turso 能够成功承载 Postgres 级别的数据库负载,那么 Rust 在系统软件领域的地位将无可撼动。
对于开发者而言,Turso 的这个项目值得高度关注。它可能不会在短期内替代传统 Postgres 部署,但它正在开辟一条极具想象力的新道路——一条通向更灵活、更可靠、真正可嵌入的数据库未来的道路。