2025 年 3 月 3 日

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

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

Rust to TypeScript Update: Boosting Prisma ORM Performance

TL;DR:无 Rust ORM 已可用于生产

Prisma ORM 的核心引擎已从基于 Rust 的查询引擎大幅转向更精简的TypeScript/WASM 核心查询编译器)。这种新架构现已可用于生产 (v6.16+),从根本上改善了您的开发者体验 (DX) 和应用程序性能。

  • 无二进制开销:消除了对原生 Rust 二进制文件的依赖,极大地简化了部署并降低了潜在的复杂性问题。
  • 性能:查询速度最高提升 3.4 倍(通过消除跨语言序列化),捆绑包大小减少 90%(从约 14MB 减至 1.6 MB)。
  • 更好地支持不同运行时:更好地支持 Cloudflare Workers、Deno、Bun、Vercel Edge 等部署环境和运行时。

要立即实现这些优势,请参阅新无 Rust ORM 的官方使用指南。您也可以在我们Prisma ORM:Rust 到 TypeScript 完整迁移之旅的博客系列中跟踪整个开发和发布历史。

打破性能障碍

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

上次更新以来,我们的团队一直专注于这个项目。随着 Prisma ORM 6.4 的发布,我们达到了一个重要的里程碑:查询编译器的一个可工作的概念验证。这个 Alpha 版本包含了运行针对我们现有 Prisma Client 实现的全面基准测试所需的 API。您可以在我们的 ORM 基准测试仓库中查看代码和完整的基准测试结果。

Prisma Client 的新架构

采用查询编译器的 Prisma Client 架构建立在我们当前用于驱动适配器的架构之上。在当前的驱动适配器实现中,Prisma Client 查询从 TypeScript 发送,通过查询引擎、驱动适配器和数据库驱动,然后最终到达您的数据库。

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

这种转变不仅仅是为了现代化;更是为了让 Prisma ORM 更快、更简单。我们相信新的架构将显著减少“陷阱”,让开发人员能够将 Prisma ORM 集成到他们的技术栈中,而无需担心兼容性问题。

新架构的主要优势

更快的性能

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

不再需要额外的二进制文件

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

最重要的是,移除二进制文件意味着如果您的环境可以运行 JavaScript,它就可以运行 Prisma ORM。我们预计 AWS Lambda 或 Cloudflare Workers 等环境的最大痛点将得到解决。您的 Prisma Client 现在将自然地融入您的应用栈。

显著减小的包大小

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

基准测试结果

数字不言自明。与现有的 Rust 查询引擎相比,新的查询编译器 (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 倍

从我们的测试中我们发现,在处理大量数据时,查询编译器始终比基于 Rust 的引擎更快,在某些情况下甚至快三到四倍。当只返回少量数据时,两种实现都表现得基本相同。查询编译器为现有 Prisma ORM 用户带来了巨大的好处,而没有缺点。

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

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

我们对这给 Prisma ORM 用户带来的意义感到非常兴奋。突破性的性能和减小的包大小不仅使您的应用程序更快、更高效,也使我们能够更快地创新。在接下来的几个月里,从预览版开始,我们将邀请您尝试这些改进。此后不久,Prisma ORM 7 将完全采用查询编译器,标志着 Prisma 与数据库通信方式进入新时代。

一如既往,我们的重点是我们的社区,我们很乐意听取您的想法!

常见问题 (FAQ)

Prisma ORM 的无 Rust 二进制版本Prisma ORM 6.16 版本起已可用于生产,以下是我们用户的一些常见问题:

没有 Rust 引擎,Prisma 的包大小缩小了多少,为什么这有助于冷启动?

当 Prisma 移除 Rust 二进制查询引擎后,包大小从大约14 MB(gzip 压缩后 7 MB)降至大约1.6 MB(gzip 压缩后 600 KB),减少了85% 到 90%

这个更小的包在无服务器和边缘环境中加载更快,例如 AWS LambdaCloudflare WorkersVercel Edge Functions

由于需要加载和初始化的代码更少,冷启动变得更快,内存使用也减少了。

与旧的 Rust 引擎相比,使用无 Rust 二进制的 Prisma ORM 查询速度有多快?

在内部基准测试中,无 Rust 二进制的 Prisma ORM,也称为查询编译器,带来了显著的性能提升:

  • 包含 25,000 条记录的 findMany185 毫秒提升到 55 毫秒(约快 3.4 倍
  • take = 2000 的 findMany6.6 毫秒提升到 3.1 毫秒(约快 2.1 倍
  • 复杂连接从207 毫秒提升到 130 毫秒(约快 1.6 倍

您可以在Rust 到 TypeScript 性能更新博客中阅读更多信息。

这些改进在大型或复杂查询上最为显著。

无 Rust 二进制的 Prisma ORM 能在 Cloudflare、Deno 和 Bun 等运行时中工作吗?

是的。由于 Prisma 的新引擎完全在 TypeScript 和 WebAssembly 中运行,它不再依赖于原生二进制文件。

您现在可以在支持 JavaScript 或 WASM 的环境中(例如 Cloudflare WorkersBunDeno)使用 Prisma。

要启用它,请使用新的 prisma-client 生成器并为您的数据库配置正确的驱动适配器,例如 PostgreSQL 的 @prisma/adapter-pg

有关设置说明,请参阅Prisma 客户端生成器文档

如果 Rust 已经很快了,为什么切换到 TypeScript 和 WebAssembly 会让 Prisma 更快?

Rust 是一种非常快的系统语言,但在旧的架构中,Prisma 必须在 Rust 和 JavaScript 之间序列化和反序列化数据。

这种跨语言通信增加了开销,特别是对于大型查询。

新的查询编译器在 TypeScript 和 WebAssembly 中运行,这消除了对序列化步骤的需求,从而实现了更快的查询执行。

您可以在从 Rust 到 TypeScript:Prisma ORM 的新篇章中了解更多关于这一变化的信息。

使用无 Rust 二进制的 Prisma ORM 需要进行哪些更改?

要迁移到新版本,请执行以下操作:

  1. 使用新的 prisma-client 生成器,并在您的 schema.prisma 文件中设置 engineType = "client"
  2. 删除 binaryTargets 配置(不再需要)。
  3. 安装适用于您数据库的相应驱动程序适配器,例如 PostgreSQL 的 @prisma/adapter-pg 或 SQLite 的 @prisma/adapter-sqlite
  4. 运行 npx prisma generate 以重新生成您的 Prisma Client。

您可以在无 Rust 二进制 ORM 的 Prisma 文档中查看完整的使用指南。

如果需要,我可以切换回 Rust 引擎吗?

是的。如果您遇到兼容性问题,可以通过使用 6.16.0 之前的旧 Prisma ORM 版本来暂时恢复到旧版 Rust 引擎。

但是,无 Rust 二进制引擎现在是默认设置,并且建议所有新项目都使用它。

迁移步骤和回退指南可在无 Rust 的 Prisma ORM 生产发布博客中找到

不要错过下一篇文章!

订阅 Prisma 新闻通讯

© . This site is unofficial and not affiliated with Prisma Data, Inc.