2025 年 3 月 3 日

Rust 转 TypeScript 更新:提升 Prisma ORM 性能

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

突破性能障碍

快速回顾一下,Query Compiler 项目是我们将用 Rust 编写的 Prisma 查询引擎替换为精简的 WASM 模块和补充 TypeScript 代码的努力。通过这一改变,我们预期能获得更快的查询速度和更小的占用空间,现在我们已经运行了基准测试来证明这一点。

上次更新以来,我们的团队一直在全力投入这个项目。随着 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 毫秒185.0 毫秒QC 快 3.4 倍
findMany, take 20003.1 毫秒6.6 毫秒QC 快 2.1 倍
findMany with where and take 200010.8 毫秒13.3 毫秒QC 快 1.2 倍
findMany with orderBy and take 505.8 毫秒7.2 毫秒QC 快 1.2 倍
findMany with where, to-many join, and take 200072.3 毫秒92.3 毫秒QC 快 1.3 倍
findMany with where, to-many → to-one join, and take 2000130.0 毫秒207.0 毫秒QC 快 1.6 倍
findMany with to-many relational filter, take 100333.0 毫秒330.0 毫秒Rust 快 1.01 倍
findMany with deep relational filter, take 1001.5 毫秒2.4 毫秒QC 快 1.6 倍
findMany with to-one filter, take 1001.3 毫秒1.4 毫秒QC 快 1.1 倍
findMany with to-many → to-many → to-one relational filter, take 100300.0 毫秒323.0 毫秒QC 快 1.1 倍
findUnique with take three of to-many join23.2 毫秒23.5 毫秒QC 快 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 新闻通讯