2025年7月24日

无 Rust 的 Prisma ORM:最新性能基准测试

Prisma ORM 内部从 Rust 迁移到 TypeScript 的工作现已为所有一级数据库提供预览!在本文中,我们将分享在最新基准测试中观察到的性能改进,并展望 Prisma v7,届时 ORM 将默认“无 Rust”。

Prisma ORM without Rust: Latest Performance Benchmarks

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 ORM 处于预览阶段

我们从 Rust 迁移到 TypeScript 不仅改善了开发者体验,还使 Prisma ORM 更加灵活和易于使用——无论您使用不同的 JavaScript 运行时、部署平台还是像 monorepos 这样的项目设置。最重要的是,它带来了显著的性能改进。

在过去的几次发布中,我们逐步推出了 Prisma ORM 对所有主要 SQL 数据库的预览支持。现在它可用于:PostgreSQL、CockroachDB、Neon、MySQL、MariaDB、PlanetScale、SQLite、D1 和 MS SQL Server 数据库。

我们正在继续努力摆脱 Rust,目标是在即将发布的 Prisma v7 版本中,将“无 Rust”的 Prisma ORM 作为默认选项。在本文中,我们将分享使用最新无 Rust 预览版 Prisma ORM 测量到的性能改进的更新。

回顾:为什么要摆脱 Rust?

我们最初选择基于 Rust 的架构是因为我们希望 Prisma ORM 能够支持各种编程语言。五年后,很明显 TypeScript 已成为构建 Web 应用程序的主导语言,支持多种语言的目标已次于为 TypeScript 开发者提供最佳 DX。

考虑到这一点,我们摆脱 Rust 的主要原因有:

  • 更小的捆绑包大小:尽管在过去几年中我们已经设法将其减少了不少,但引擎二进制文件仍然显著增加了应用程序的捆绑包大小。
  • 更快的查询:跨语言边界的序列化使得查询(尤其是返回大量数据的查询)变慢。消除此开销使 Prisma ORM 显著加快。
  • 更低的 CPU 占用:将查询引擎作为二进制文件与应用程序一起运行会产生额外的 CPU 使用量,而无 Rust ORM 版本将消除此开销。
  • 更低的部署复杂性:部署应用程序时,查询引擎二进制文件需要为您的托管提供商的操作系统进行编译。此额外步骤有时会导致额外问题,而使用无引擎的 Prisma ORM 将不会出现这些问题。
  • 更简单的社区贡献:Prisma ORM 是开源的,但其核心是用 Rust 编写的,这使得我们的社区很难对其做出重大贡献。我们很高兴迁移到 TypeScript 将降低开发人员的贡献门槛,并期待与社区进行更多协作。

如果您想了解更多信息,可以查看我们之前关于此主题的文章:

基准测试更新:无 Rust 的 Prisma ORM 更快

我们持续对 Prisma ORM 的新版本进行基准测试,以监控任何变化并防止在从 Rust 迁移到 TypeScript 的过程中出现性能退化。您可以在基准测试仓库中找到有关我们设置的所有详细信息。

在最新的基准测试运行中,我们发现,对于我们测试的几乎所有查询,与之前基于 Rust 的 Prisma ORM 版本相比,性能都有所提高

查询Rust无 Rust 和 pg 比较 (Rust ÷ QC)findMany (所有 25k)163 毫秒77 毫秒2.12倍findMany (取 2k)8 毫秒5 毫秒1.60倍findMany (where + 取 2k)10 毫秒8 毫秒1.25倍findMany (orderBy + 取 50)5 毫秒5 毫秒1.00倍update (单个)1 毫秒1 毫秒1.00倍findMany (include cast, m2m, take 2k)1539 毫秒136 毫秒11.32倍findMany (where + include cast, m2m, take 2k)82 毫秒38 毫秒2.16倍findMany (include cast + person, where, take 2k)169 毫秒70 毫秒2.41倍findMany (where reviews.author, to-many → to-one)177 毫秒182 毫秒0.97倍findMany (where cast.person, m2m → to-one)1 毫秒2 毫秒0.50倍review.findMany (where author, to-one)1 毫秒1 毫秒1.00倍actor.findMany (movies.reviews.author, to-many → to-one)178 毫秒179 毫秒0.99倍findUnique (include reviews.take 3)19 毫秒25 毫秒0.76倍findUnique (include cast.take 3)1 毫秒1 毫秒1.00倍actor + 25 部电影 (已排序), 每部 15 个演员9 毫秒11 毫秒0.82倍

注意:这些基准测试是在 PostgreSQL 数据库上创建的,无 Rust 的 Prisma ORM 版本使用pg 驱动程序。

总的来说,无 Rust 的 Prisma ORM 版本带来了显著的性能改进——尤其是在处理大型数据集时。在我们的基准测试中,返回大量数据的查询在新版基于 TypeScript 的实现中始终更快。

对于小型查询,两个版本之间的性能差异很小。在某些情况下,基于 Rust 的版本略快,但仅当绝对查询时间已经非常低(例如 1-2 毫秒)时。这些微小的增益在实践中没有意义,也无法抵消无 Rust 版本更广泛的优势。

我们的主要结论是,没有 Rust 的 Prisma ORM 在最重要的地方(大型复杂查询)通常显着更快,同时在简单查询上保持一致。

另一个好处是:无 Rust 的 Prisma ORM 的 CPU 占用显著减少,因为它不再有单独的引擎二进制文件与您的应用程序并行运行。

开始使用无 Rust 的 Prisma ORM

如果您阅读此文后感到好奇,以下是尝试无 Rust 版本 Prisma ORM 所需的步骤:

  1. 在您的 Prisma schema 中启用 queryCompilerdriverAdapters 预览功能标志

    注意:取代查询引擎的新内部组件称为查询编译器(query compiler),因此预览功能标志的名称也来源于此。

  2. 运行 prisma generate 以重新生成 Prisma Client

  3. 为您的数据库安装驱动程序适配器(例如,如果您使用 PostgreSQL,则安装@prisma/adapter-pg

  4. 您可以像这样实例化 PrismaClient

在基于 Rust 的 Prisma ORM 版本中,您会在 output 目录(如果未设置专门的 output 路径,则在 node_modules 中)找到一个引擎二进制文件。您现在可以通过验证此二进制文件是否存在来检查您是否正在使用无 Rust 的 Prisma ORM 版本。顺便说一句,这将显著减小您整个应用程序的捆绑包大小 🎉

试用并分享您的反馈

无 Rust 的 Prisma ORM 正在接近正式发布,我们很高兴您现在可以为 Prisma ORM 支持的任何主要数据库试用它。

请遵循以上说明或尝试我们的现成示例项目(它们也使用了新的、ESM-优先的prisma-client生成器),例如:

Discord 上分享您的反馈,或在 X 上联系我们。

不要错过下一篇文章!

订阅 Prisma 新闻通讯

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