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) 架构带来了性能提升,并且随着检索数据量的增加,提升效果越来越明显。它恰好在最需要的时候更快。
基准测试 | QC | Rust | 结论 |
---|---|---|---|
findMany (25,000 条记录) | 55.0 毫秒 | 185.0 毫秒 | QC 快 3.4 倍 |
findMany, take 2000 | 3.1 毫秒 | 6.6 毫秒 | QC 快 2.1 倍 |
findMany with where and take 2000 | 10.8 毫秒 | 13.3 毫秒 | QC 快 1.2 倍 |
findMany with orderBy and take 50 | 5.8 毫秒 | 7.2 毫秒 | QC 快 1.2 倍 |
findMany with where, to-many join, and take 2000 | 72.3 毫秒 | 92.3 毫秒 | QC 快 1.3 倍 |
findMany with where, to-many → to-one join, and take 2000 | 130.0 毫秒 | 207.0 毫秒 | QC 快 1.6 倍 |
findMany with to-many relational filter, take 100 | 333.0 毫秒 | 330.0 毫秒 | Rust 快 1.01 倍 |
findMany with deep relational filter, take 100 | 1.5 毫秒 | 2.4 毫秒 | QC 快 1.6 倍 |
findMany with to-one filter, take 100 | 1.3 毫秒 | 1.4 毫秒 | QC 快 1.1 倍 |
findMany with to-many → to-many → to-one relational filter, take 100 | 300.0 毫秒 | 323.0 毫秒 | QC 快 1.1 倍 |
findUnique with take three of to-many join | 23.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 与数据库通信方式迈入新时代。
一如既往,我们的重点在于社区,我们很想听听您的想法!
- 随时关注最新更新,并在 GitHub 上加入讨论
- 在我们的开发者 AMA 中,于 Discord 上向我们提出紧迫的问题
- 甚至可以自己运行基准测试!
不要错过下一篇文章!
订阅 Prisma 新闻通讯