🚀 解决 Prisma 变慢问题

修复慢速 Prisma 查询
立即提速 2–7 倍(最高 53.5 倍)

Prisma 太慢?你并不孤单。喜欢 Prisma 的开发体验但需要更好的性能? 将慢速 Prisma 查询速度提升 2–7 倍 (SQLite 关系过滤最高 53.5 倍),无需修改现有查询代码。

更快的 Prisma 读取
无需改动查询
生产就绪
137 个端到端测试
一行代码解决 Prisma 慢
import { PrismaClient, Prisma } from '@prisma/client'
import { speedExtension, convertDMMFToModels } from 'prisma-sql'
import postgres from 'postgres'

const sql = postgres(process.env.DATABASE_URL)
const models = convertDMMFToModels(Prisma.dmmf.datamodel)

const prisma = new PrismaClient().$extends(
  speedExtension({ postgres: sql, models })
)

const users = await prisma.user.findMany({
  where: { status: 'ACTIVE' },
  include: { posts: true }
})
2–7倍
更快的 Prisma 读取
典型加速
0
查询改动
保持现有 Prisma 调用不变
137
端到端测试
已验证的解决方案
100%
类型安全
相同的 Prisma API

为什么 Prisma 慢?

了解 Prisma 的演进和性能特征有助于解释为什么存在这个扩展。

Prisma 的选择:优先 DX,但规模化时性能更关键

🎯 2019:现代 Prisma 的诞生

Prisma 2 于 2019 年推出,推动了 TypeScript ORM 的发展:基于 schema 的类型安全访问与类型生成。引擎式架构使 Prisma 能够翻译查询、验证输入并提供一致的 API 语义。

⚡ 2020–2022:快速增长与功能扩展

Prisma 增加了嵌套写入、事务与中间件等能力。功能更强的同时,每个查询仍要承担架构成本:请求表示、验证、执行与结果整形以匹配 Prisma API。

📊 2023:规模化时开销更明显

在高并发与读密集的生产负载中,固定的每次查询开销变得可测量。它通常在读取、分析、聚合以及大结果集上更明显。这不是 bug,而是 Prisma 保证与 API 行为的代价。

🚀 2024–2025:Prisma 持续优化性能

Prisma 在此期间发布了多次重要更新,包含性能与引擎层面的改进。即便如此,相比直接执行原始 SQL,查询处理与结果整形仍会带来不可避免的额外成本。

🎯 2026:prisma-sql 扩展发布

该扩展专注于读取性能。它为 findMany、findFirst、findUnique、count、aggregate、groupBy 提供更快的读取执行路径,同时保留 Prisma 用于写入、迁移、schema 管理与类型生成。上线前请确认与你的 Prisma 版本兼容。

💡 为什么存在这个扩展

Prisma 在类型安全、开发者体验与跨数据库一致性上做了正确的架构选择,但这些选择会带来规模化时明显的开销。此扩展不替代 Prisma,而是为读取提供更快的执行路径,保留 Prisma 的 DX。

查询转换层

Prisma 将查询输入转换为特定数据库的 SQL,从而实现一致的 API 行为与跨数据库语义,但在数据库执行前会增加处理时间。

验证与保证

Prisma 根据 schema 验证查询并确保 API 级别的保证。这些保障能避免一类问题,但也会增加每次查询的开销。

结果整形

结果会被整形以匹配 Prisma 的 API 行为。这提升了 DX 与一致性,但在大结果集与复杂 include 上会增加延迟。

此扩展通过为读取提供更快路径来补充 Prisma:保留 Prisma 的开发体验,同时在典型场景获得 2–7 倍更快的读取(SQLite 关系过滤最高 53.5 倍)。

到底快多少?真实基准测试

Prisma v6、v7、Drizzle ORM 与 Prisma-SQL 的全面对比

基准测试环境:MacBook Pro M1 • PostgreSQL 15 • SQLite 3.43 • 每个数据库 137 个测试用例

PostgreSQL

57 个测试用例的平均值

Prisma v6
2.10ms
Prisma v7
1.95ms
1.08× faster
Drizzle ORM
1.40ms
1.50× faster
Prisma-SQL ⚡
0.90ms
2.34× faster
6.3×
DISTINCT 查询
对比 Prisma v6
5.5×
关系过滤
对比 Prisma v6("none"-过滤器)

SQLite

56 个测试用例的平均值

Prisma v6
5.48ms
Prisma v7
4.12ms
1.33× faster
Drizzle ORM
2.11ms
2.60× faster
Prisma-SQL ⚡
0.73ms
7.50× faster
12.6×
简单查询
对比 Prisma v6
69.7×
关系过滤
对比 Prisma v6("none"-过滤器)

基准测试基于每个数据库 137 个 E2E 测试。Prisma v6.16.3, Prisma v7.2.0, Drizzle ORM latest. 查看完整基准测试数据 →

详细基准测试结果

采用 Welch t 检验并设置 1ms 实际显著性阈值的统计比较

这些结果反映了 运行时模式,在该模式下,每次请求都会将查询转换为 SQL。在 预渲染模式 中,SQL 在构建阶段生成——运行时直接执行原始的参数化查询,无任何转换开销。

PostgreSQL Prisma v6

平均 2.07x(相较于 Prisma) 平均 1.68x(相较于 Drizzle) 28/95 项具有统计显著性的胜出 65 项在噪声阈值范围内
Mar 7, 2026
测试 Prisma prisma-sql Drizzle 加速比 显著性 CV% n
findMany basic 0.536ms ±0.016 0.272ms ±0.043 1.37ms ~1.00x 57.0% 50
findMany where = 0.596ms ±0.046 0.354ms ±0.022 0.442ms ~1.00x 22.3% 50
findMany where >= 16.48ms ±0.251 4.89ms ±0.382 6.48ms 3.37x 1.33x D *** 28.2% 50
findMany where IN 0.609ms ±0.034 0.325ms ±0.016 0.436ms ~1.00x 17.5% 50
findMany where null 0.254ms ±0.0094 0.122ms ±0.0030 0.167ms ~1.00x 8.7% 50
findMany ILIKE 0.290ms ±0.043 0.231ms ±0.0083 0.296ms ~1.00x 13.2% 50
findMany AND 2.77ms ±0.076 1.00ms ±0.109 2.12ms 2.77x 2.12x D *** 39.3% 50
findMany OR 14.10ms ±0.361 4.05ms ±0.388 6.96ms 3.48x 1.72x D *** 34.6% 50
findMany NOT 0.631ms ±0.042 0.363ms ±0.026 0.454ms ~1.00x 26.3% 50
findMany orderBy 2.11ms ±0.080 0.893ms ±0.081 1.12ms 2.36x 1.25x D *** 32.7% 50
findMany pagination 0.248ms ±0.013 0.217ms ±0.0089 0.228ms ~1.00x 14.9% 50
findMany select 0.309ms ±0.058 0.101ms ±0.0064 0.116ms ~1.00x 22.6% 50
findMany relation some 0.910ms ±0.030 0.450ms ±0.016 ~1.00x 12.6% 50
findMany relation every 0.710ms ±0.026 0.491ms ±0.012 ~1.00x 8.7% 50
findMany relation none 31.70ms ±4.16 7.65ms ±0.483 4.15x *** 22.8% 50
findMany nested relation 0.952ms ±0.088 1.06ms ±0.138 ~1.00x 46.7% 50
findMany complex 1.12ms ±0.029 0.520ms ±0.017 0.651ms ~1.00x 11.7% 50
findFirst 0.240ms ±0.013 0.195ms ±0.014 0.262ms ~1.00x 25.0% 50
findFirst skip 0.284ms ±0.018 0.176ms ±0.0080 0.219ms ~1.00x 16.7% 50
findUnique id 0.220ms ±0.016 0.163ms ±0.028 0.167ms ~1.00x 61.9% 50
findUnique email 0.180ms ±0.012 0.104ms ±0.0075 0.133ms ~1.00x 26.0% 50
count 0.124ms ±0.026 0.048ms ±0.0019 0.063ms ~1.00x 13.8% 50
count where 0.435ms ±0.0094 0.265ms ±0.011 0.273ms ~1.00x 15.4% 50
aggregate count 0.230ms ±0.0069 0.151ms ±0.0028 ~1.00x 6.5% 50
aggregate sum/avg 0.355ms ±0.018 0.263ms ±0.013 ~1.00x 18.0% 50
aggregate where 0.438ms ±0.010 0.275ms ±0.014 ~1.00x 18.9% 50
aggregate min/max 0.344ms ±0.015 0.289ms ±0.031 ~1.00x 38.6% 50
aggregate complete 0.420ms ±0.014 0.317ms ±0.033 ~1.00x 37.4% 50
groupBy 0.447ms ±0.015 0.339ms ±0.011 ~1.00x 11.4% 50
groupBy count 0.461ms ±0.011 0.381ms ±0.014 ~1.00x 13.0% 50
groupBy multi 0.573ms ±0.019 0.431ms ±0.0097 ~1.00x 8.1% 50
groupBy having 0.585ms ±0.034 0.473ms ±0.011 ~1.00x 8.6% 50
groupBy + where 0.596ms ±0.031 0.431ms ±0.038 ~1.00x 31.5% 50
_count via include 0.702ms ±0.023 0.704ms ±0.040 ~1.00x 20.4% 50
_count via include + relations 1.86ms ±0.108 1.48ms ±0.072 ~1.00x 17.7% 50
groupBy aggregates 0.576ms ±0.027 0.578ms ±0.062 ~1.00x 38.8% 50
groupBy min/max 0.571ms ±0.048 0.589ms ±0.073 ~1.00x 44.8% 50
include list + nested to-one 1.77ms ±0.103 0.460ms ±0.034 3.86x *** 26.9% 50
include list + nullable to-one 2.77ms ±0.100 2.14ms ±0.170 ~1.00x 28.6% 50
include posts 2.86ms ±0.201 1.07ms ±0.069 6.00ms 2.66x 5.58x D *** 23.2% 50
include profile 0.533ms ±0.027 0.489ms ±0.030 0.549ms ~1.00x 21.8% 50
include 3 levels 1.99ms ±0.100 1.70ms ±0.190 1.96ms ~1.00x 40.2% 50
include 4 levels 2.45ms ±0.103 1.25ms ±0.030 3.81ms 1.96x 3.05x D *** 8.8% 50
include + where 2.61ms ±0.100 0.948ms ±0.100 4.59ms 2.76x 4.84x D *** 38.1% 50
include + select nested 2.27ms ±0.124 1.34ms ±0.106 3.71ms ~1.00x 28.5% 50
findMany startsWith 0.282ms ±0.031 0.185ms ±0.030 0.230ms ~1.00x 58.7% 50
findMany endsWith 0.640ms ±0.057 0.296ms ±0.049 0.470ms ~1.00x 59.0% 50
findMany NOT contains 0.661ms ±0.024 0.329ms ±0.050 0.413ms ~1.00x 55.1% 50
findMany LIKE 0.257ms ±0.026 0.181ms ±0.0061 0.208ms ~1.00x 12.3% 50
findMany < 27.72ms ±2.31 6.64ms ±0.325 11.44ms 4.18x 1.72x D *** 17.7% 50
findMany <= 28.41ms ±0.842 6.96ms ±0.419 11.50ms 4.08x 1.65x D *** 21.7% 50
findMany > 18.50ms ±3.09 4.00ms ±0.196 6.24ms 4.63x 1.56x D *** 17.7% 50
findMany NOT IN 0.593ms ±0.032 0.285ms ±0.012 0.351ms ~1.00x 15.4% 50
findMany isNot null 0.580ms ±0.017 0.194ms ±0.0036 0.294ms ~1.00x 6.6% 50
orderBy multi-field 5.19ms ±0.480 3.14ms ±1.04 1.51ms 1.66x 0.48x D ** 119.3% 50
orderBy relation to-one 2.38ms ±0.066 1.72ms ±0.131 ~1.00x 27.5% 50
orderBy relation + scalar 2.22ms ±0.039 1.69ms ±0.093 ~1.00x 19.9% 50
orderBy nullable relation 1.94ms ±0.056 1.30ms ±0.058 ~1.00x 16.0% 50
orderBy deep relation 2.45ms ±0.070 1.73ms ±0.040 ~1.00x 8.3% 50
orderBy deep relation + scalar 3.38ms ±0.250 2.07ms ±0.053 1.63x *** 9.2% 50
distinct status 11.52ms ±2.73 1.38ms ±0.137 8.33x *** 35.8% 50
distinct multi 14.12ms ±0.732 2.60ms ±0.054 5.43x *** 7.5% 50
cursor composite tuple 1.97ms ±0.081 1.50ms ±0.081 ~1.00x 19.4% 50
cursor composite desc 2.91ms ±1.29 1.66ms ±0.135 1.75x ns 29.4% 50
cursor prefix of orderBy 2.03ms ±0.074 1.38ms ±0.040 ~1.00x 10.4% 50
select + include 1.19ms ±0.081 0.254ms ±0.015 0.415ms ~1.00x 21.8% 50
_count relation 0.898ms ±0.070 0.648ms ±0.034 ~1.00x 19.2% 50
_count multi-relation 0.244ms ±0.014 0.172ms ±0.0080 ~1.00x 17.1% 50
_count inside include 1.37ms ±0.055 1.35ms ±0.130 ~1.00x 34.7% 50
_count inside nested select 1.91ms ±0.049 1.43ms ±0.057 ~1.00x 14.4% 50
_count deep include 1.92ms ±0.040 1.40ms ±0.044 ~1.00x 11.4% 50
ILIKE special chars 0.511ms ±0.262 0.177ms ±0.0064 ~1.00x 12.8% 50
LIKE case sensitive 0.213ms ±0.012 0.164ms ±0.0053 ~1.00x 11.5% 50
findMany Date range 0.368ms ±0.018 0.517ms ±0.019 0.833ms ~1.00x 13.6% 50
count Date range 0.508ms ±0.016 0.817ms ±0.295 0.438ms ~1.00x 130.1% 50
findMany Date gte 0.387ms ±0.032 0.184ms ±0.0025 0.242ms ~1.00x 5.0% 50
depth-1 low-fan 0.502ms ±0.045 0.666ms ±0.303 ~1.00x 164.1% 50
depth-1 mid-fan 3.02ms ±0.187 1.26ms ±0.148 2.40x *** 42.3% 50
depth-1 high-fan 3.49ms ±0.138 1.01ms ±0.066 3.44x *** 23.3% 50
depth-1 wide 6.05ms ±1.65 1.51ms ±0.104 4.00x *** 24.8% 50
depth-1 unbound 43.36ms ±2.79 8.43ms ±0.343 5.14x *** 14.7% 50
depth-2 3.79ms ±0.176 2.60ms ±0.150 1.45x *** 20.8% 50
depth-2 paginated Project→tasks 1.52ms ±0.067 1.66ms ±0.174 ~1.00x 37.9% 50
depth-2 high-fan 2.14ms ±0.044 1.21ms ±0.060 ~1.00x 18.1% 50
depth-2 wide 5.24ms ±0.307 1.92ms ±0.179 2.73x *** 33.8% 50
depth-2 unbound 78.61ms ±23.12 13.71ms ±0.633 5.74x *** 7.5% 10
depth-3 unbound 16.38ms ±1.37 6.59ms ±0.241 2.49x *** 13.2% 50
depth-3 paginated 2.04ms ±0.117 2.19ms ±0.542 ~1.00x 89.3% 50
depth-4 unbound 9.62ms ±0.235 3.27ms ±0.186 2.94x *** 20.5% 50
depth-4 paginated 2.56ms ±0.095 1.78ms ±0.230 ~1.00x 46.4% 50
findFirst depth-2 3.53ms ±0.968 1.52ms ±0.134 2.33x *** 32.0% 50
findUnique depth-2 Project→tasks→comment 2.77ms ±0.164 2.94ms ±0.761 ~1.00x 93.5% 50
complex nested select 5.70ms ±0.317 4.49ms ±0.196 1.27x *** 15.7% 50
ultra deep query 7.62ms ±0.180 11.97ms ±5.92 0.64x ns 178.5% 50
transaction: (3 operations) 2.91ms ±0.054 1.23ms ±0.069 2.37x *** 20.4% 50
*** p < 0.001 ** p < 0.01 *  p < 0.05 ns 无统计显著性  在 1ms 噪声阈值范围内 ± 95% 置信区间 CV% > 15% = 高方差
已对运行时模式进行基准测试。 预渲染模式在运行时完全跳过查询到 SQL 的转换——预计延迟将低于此处显示的结果,尤其是在复杂查询中,转换成本相对更高。

它如何优化 Prisma

绕过 Prisma 的读取执行路径,同时保留 Prisma 的 API 与类型

1

拦截 Prisma 查询

扩展在读取操作(findMany、findFirst、findUnique、count、aggregate、groupBy)执行前捕获它们

2

生成优化的 SQL

将 Prisma 查询转换为具有优化 JOIN 的快速参数化 SQL

3

直接执行

通过 postgres.js 或 better-sqlite3 直接执行读取,绕过 Prisma 读取开销

4

返回兼容结果

结果与 Prisma 期望的结构一致。类型、IntelliSense 与现有查询代码保持不变

const users = await prisma.user.findMany({
  where: { status: 'ACTIVE' },
  include: { posts: true }
})

// 读取使用直接 SQL 执行
// 在该负载下基准约 ~1.00ms
// 查询代码不变

为什么选择这个 Prisma 扩展?

为读取获得更快的 SQL 执行速度,同时保留 Prisma 的开发体验

即时 Prisma 加速

一次性配置即可加速 Prisma 读取。无需重构、迁移或停机。

保留你的 Prisma 类型

保持完整的 TypeScript 支持。在加速读取的同时保留类型推断、自动完成与编译期安全性。

生产级验证方案

137 个端到端测试验证与较新 Prisma 版本兼容。已用于生产环境加速读取。

多数据库支持

在 PostgreSQL(包括 Neon、Supabase)与 SQLite 上优化 Prisma 读取。

预编译选项

可选生成器在构建时创建 SQL,将最热查询的开销减少到微秒。

Serverless 就绪(Node 运行时)

适用于 serverless Node 运行时。Edge 运行时支持取决于运行时限制与所使用的驱动。

Prisma 性能最重要的场景

此扩展产生实际影响的常见场景

📊 分析和报告

聚合与 groupBy 往往能从直接 SQL 执行中明显受益

  • groupBy 最高可加速约 5 倍
  • 更快的 aggregate 查询
  • 更低延迟的实时指标

🚀 高流量 API

在高并发下固定开销会叠加,尤其是读密集端点

  • 更低的 API 响应时间
  • 同等资源处理更多请求
  • 降低基础设施成本

☁️ 无服务器函数

无服务器中每毫秒都很重要:降低读取延迟

  • 更好的 p95/p99 读取延迟
  • 通过更快读取降低成本
  • 无需重构即可提速

📱 移动后端

用户能感知延迟:更快的读取能立即改善体验

  • 更快的信息流加载
  • 更快的分页
  • 更顺滑的交互

3 步优化 Prisma

在 60 秒内加速 Prisma 读取

① 安装 Prisma 扩展

# PostgreSQL
npm install prisma-sql postgres

# SQLite
npm install prisma-sql better-sqlite3

② 将扩展添加到 Prisma Client

import { PrismaClient, Prisma } from '@prisma/client'
import { speedExtension, convertDMMFToModels } from 'prisma-sql'
import postgres from 'postgres'

const sql = postgres(process.env.DATABASE_URL)
const models = convertDMMFToModels(Prisma.dmmf.datamodel)

const prisma = new PrismaClient().$extends(
  speedExtension({ postgres: sql, models })
)

③ 正常使用 Prisma

const users = await prisma.user.findMany({
  where: { status: 'ACTIVE' },
  include: { posts: true }
})

Prisma 性能常见问题

关于优化 Prisma 读取的常见问题

为什么 Prisma 有开销?

Prisma 会增加开销,因为它实现了 API 层保证:基于 schema 的验证、一致的查询行为和结果整形。这些层带来更好的开发体验,但相比直接执行原始 SQL 会消耗更多时间。

如何优化 Prisma 查询?

使用此扩展优化读密集场景。它通过 postgres.js 或 better-sqlite3 直接执行读取 SQL,同时保持 Prisma 的 API 与类型。只需要对 Prisma Client 初始化做一次小改动,无需重构现有查询。

Prisma 比原始 SQL 慢吗?

在很多读取负载下是的,因为存在架构性开销。此扩展的目标是在保留 Prisma DX 的同时,通过直接 SQL 执行降低读取延迟。

我可以在不修改现有查询的情况下加速 Prisma 吗?

可以。只需在 Prisma Client 初始化时加一次扩展,现有 Prisma 查询代码无需改变。读取会更快,同时 API、类型与 schema 保持一致。

这在生产中有效吗?

可以。它有 137 个端到端测试,并以生产使用为目标。上线前建议确认与你的 Prisma 版本兼容,并跑一遍自己的回归测试。

是什么导致 Prisma 聚合变慢?

聚合与 groupBy 往往会放大固定开销(查询处理与结果整形),并可能涉及更大的中间数据。此扩展通过直接生成并执行 SQL 来优化这些读取,通常能降低聚合型端点延迟。

准备好加速 Prisma 了吗?

加入已优化 Prisma 读取的开发者:提速 2–7 倍(最高 53.5 倍)