2025年3月3日

Rust 到 TypeScript 的更新:提升 Prisma ORM 性能

Query Compiler 项目通过将传统的 Rust 引擎替换为基于 WASM 模块和 TypeScript 构建的更精简的解决方案,升级了 Prisma ORM。这一改变提升了查询性能,将打包体积减小了 85-90%,同时还改善了与各种 Web 框架和打包工具的兼容性。随着 Prisma ORM 迈向版本 7,开发者可以期待更流畅、更高效的体验。

Rust to TypeScript Update: Boosting Prisma ORM Performance

突破性能瓶颈

快速回顾一下,Query Compiler 项目旨在用精简的 WASM 模块和辅助 TypeScript 代码来取代用 Rust 编写的 Prisma 查询引擎。通过此举,我们期望实现更快的查询速度和更小的占用空间,现在我们已经运行了基准测试来证明这一点。

上次更新以来,我们的团队一直全身心投入到这个项目中。随着 Prisma ORM 6.4 的发布,我们达到了一个重要的里程碑:Query Compiler 的工作原型。这个 alpha 版本包含了运行针对现有 Prisma Client 实现的全面基准测试所需的 API。您可以在我们的ORM 基准测试仓库中查看代码和完整的基准测试结果。

Prisma Client 的新架构

带有 Query Compiler 的 Prisma Client 架构建立在我们当前 Driver Adapters 的架构之上。在当前的 Driver Adapters 实现中,Prisma Client 查询从 TypeScript 发送,经过查询引擎、驱动适配器和数据库驱动,最终到达您的数据库。

有了 Query Compiler,Prisma Client 查询会首先被翻译成内部查询计划,然后传回客户端,通过相同的驱动适配器和数据库驱动设置发送到您的数据库。如果您今天正在使用 driverAdapters 预览功能,新的实现方式将非常相似。

这一转变不仅仅是现代化;它是为了让 Prisma ORM 更快、更简单。我们相信新架构将显著减少“意外”,让开发者无需担心兼容性问题,即可将 Prisma ORM 集成到他们的技术栈中。

新架构的主要优势

更快的性能

这个项目背后的主要驱动力是,虽然 Rust 速度很快,但 Rust 和 TypeScript 之间数据序列化的成本非常高。这个成本抵消了我们将查询引擎放在 Rust 中的任何好处,我们已经看到新架构带来了显著的改进。

不再需要额外二进制文件

通过消除对 Rust 二进制文件的依赖,我们解决了在开发流程中管理额外文件所导致的一整类问题。从严格网络无法安装二进制文件的简单问题,到确保生产和开发环境拥有正确文件的复杂问题,所有这些问题在 Query Compiler 项目中都不复存在。

此外,移除二进制文件意味着只要您的环境可以运行 JavaScript,就能运行 Prisma ORM。我们预计 AWS Lambda 或 Cloudflare Workers 等环境中的主要痛点将得到解决。您的 Prisma Client 现在将自然地融入您的应用程序技术栈。

显著减小的打包体积

我们的初步测试表明,基于 Rust 的 Prisma 查询引擎大约为 14 MB(gzip 压缩后为 7 MB),而新的 Query Compiler 仅为 1.6 MB(gzip 压缩后为 600 KB),平均尺寸减少了 85-90%。更少的磁盘空间意味着您的部署更快,并且您的应用程序可以更容易地部署到更多平台。

基准测试结果

这些数字不言自明。与现有的 Rust 查询引擎相比,新的 Query Compiler (QC) 架构带来的性能提升会随着检索数据量的增加而逐渐变得更好。它恰恰在最关键的时候更快。

基准测试QCRust结论findMany (25,000 条记录)55.0 ms185.0 msQC 快 3.4 倍findMany, 取 2000 条3.1 ms6.6 msQC 快 2.1 倍findMany (带 where 条件), 取 2000 条10.8 ms13.3 msQC 快 1.2 倍findMany (带 orderBy), 取 50 条5.8 ms7.2 msQC 快 1.2 倍findMany (带 where 条件, to-many 连接), 取 2000 条72.3 ms92.3 msQC 快 1.3 倍findMany (带 where 条件, to-many → to-one 连接), 取 2000 条130.0 ms207.0 msQC 快 1.6 倍findMany (带 to-many 关系筛选), 取 100 条333.0 ms330.0 msRust 快 1.01 倍findMany (带深度关系筛选), 取 100 条1.5 ms2.4 msQC 快 1.6 倍findMany (带 to-one 筛选), 取 100 条1.3 ms1.4 msQC 快 1.1 倍findMany (带 to-many → to-many → to-one 关系筛选), 取 100 条300.0 ms323.0 msQC 快 1.1 倍findUnique (带 to-many 连接的前三条)23.2 ms23.5 msQC 快 1.01 倍

根据我们的测试,我们发现对于大量数据,Query Compiler 始终比基于 Rust 的引擎更快,在某些情况下甚至快三到四倍。当只返回少量数据时,两种实现的效果基本相同。Query Compiler 为现有 Prisma ORM 用户带来了巨大好处,并且没有负面影响。

然而,这些只是最初的基准测试示例。我们计划扩展这些基准测试,并在受限环境中(如 AWS Lambda 或 Cloudflare Workers)运行它们,以便我们对数据充满信心。此外,我们将继续改进我们的实现,以提高效率和带来更多好处。

拥抱未来:Prisma ORM 7 及更高版本

我们对这对 Prisma ORM 用户意味着什么感到非常兴奋。突破性的性能和减小的打包体积不仅使您的应用程序更快、更高效,而且还使我们能够更快地创新。在接下来的几个月里,我们将从一个预览版本开始,邀请您试用这些改进。此后不久,Prisma ORM 7 将全面采用 Query Compiler,标志着 Prisma 与数据库通信方式迈向新纪元。

一如既往,我们关注社区,并期待听到您的想法!

不要错过下一篇文章!

订阅 Prisma 新闻邮件

© . All rights reserved.