查询转换层
Prisma 将查询输入转换为特定数据库的 SQL,从而实现一致的 API 行为与跨数据库语义,但在数据库执行前会增加处理时间。
Prisma 太慢?你并不孤单。喜欢 Prisma 的开发体验但需要更好的性能?
将慢速 Prisma 查询速度提升 2–7 倍 (SQLite 关系过滤最高 53.5 倍),无需修改现有查询代码。
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 }
}) 了解 Prisma 的演进和性能特征有助于解释为什么存在这个扩展。
Prisma 2 于 2019 年推出,推动了 TypeScript ORM 的发展:基于 schema 的类型安全访问与类型生成。引擎式架构使 Prisma 能够翻译查询、验证输入并提供一致的 API 语义。
Prisma 增加了嵌套写入、事务与中间件等能力。功能更强的同时,每个查询仍要承担架构成本:请求表示、验证、执行与结果整形以匹配 Prisma API。
在高并发与读密集的生产负载中,固定的每次查询开销变得可测量。它通常在读取、分析、聚合以及大结果集上更明显。这不是 bug,而是 Prisma 保证与 API 行为的代价。
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 个测试用例
57 个测试用例的平均值
56 个测试用例的平均值
基准测试基于每个数据库 137 个 E2E 测试。Prisma v6.16.3, Prisma v7.2.0, Drizzle ORM latest. 查看完整基准测试数据 →
采用 Welch t 检验并设置 1ms 实际显著性阈值的统计比较
这些结果反映了 运行时模式,在该模式下,每次请求都会将查询转换为 SQL。在 预渲染模式 中,SQL 在构建阶段生成——运行时直接执行原始的参数化查询,无任何转换开销。
| 测试 | Prisma | prisma-sql | Drizzle | 加速比 | 显著性 | CV% | n |
|---|---|---|---|---|---|---|---|
| findMany basic | 0.602ms ±0.020 | 0.481ms ±0.257 | 0.357ms | ~1.00x | ≈ | 192.7% | 50 |
| findMany where = | 0.563ms ±0.015 | 0.373ms ±0.051 | 0.456ms | ~1.00x | ≈ | 49.5% | 50 |
| findMany where >= | 17.20ms ±0.509 | 4.82ms ±0.358 | 6.80ms | 3.57x 1.41x D | *** | 26.8% | 50 |
| findMany where IN | 0.614ms ±0.024 | 0.417ms ±0.031 | 0.426ms | ~1.00x | ≈ | 27.0% | 50 |
| findMany where null | 0.292ms ±0.019 | 0.158ms ±0.042 | 0.175ms | ~1.00x | ≈ | 96.9% | 50 |
| findMany ILIKE | 0.324ms ±0.054 | 0.271ms ±0.0097 | 0.295ms | ~1.00x | ≈ | 12.8% | 50 |
| findMany AND | 3.06ms ±0.169 | 1.00ms ±0.088 | 2.64ms | 3.06x 2.63x D | *** | 31.9% | 50 |
| findMany OR | 14.91ms ±0.409 | 3.98ms ±0.306 | 5.57ms | 3.75x 1.40x D | *** | 27.7% | 50 |
| findMany NOT | 0.614ms ±0.031 | 0.369ms ±0.023 | 0.408ms | ~1.00x | ≈ | 22.4% | 50 |
| findMany orderBy | 3.41ms ±0.074 | 1.28ms ±0.067 | 1.35ms | 2.67x 1.05x D | *** | 18.8% | 50 |
| findMany pagination | 0.323ms ±0.027 | 0.233ms ±0.026 | 0.242ms | ~1.00x | ≈ | 39.5% | 50 |
| findMany select | 0.289ms ±0.018 | 0.168ms ±0.041 | 0.199ms | ~1.00x | ≈ | 87.7% | 50 |
| findMany relation some | 1.24ms ±0.072 | 0.843ms ±0.069 | — | ~1.00x | ≈ | 29.7% | 50 |
| findMany relation every | 0.717ms ±0.017 | 0.619ms ±0.062 | — | ~1.00x | ≈ | 36.0% | 50 |
| findMany relation none | 31.99ms ±0.908 | 6.99ms ±0.368 | — | 4.58x | *** | 19.0% | 50 |
| findMany nested relation | 0.740ms ±0.023 | 0.959ms ±0.139 | — | ~1.00x | ≈ | 52.5% | 50 |
| findMany complex | 1.19ms ±0.027 | 0.514ms ±0.013 | 0.721ms | ~1.00x | ≈ | 8.9% | 50 |
| findFirst | 0.239ms ±0.016 | 0.221ms ±0.025 | 0.209ms | ~1.00x | ≈ | 40.3% | 50 |
| findFirst skip | 0.291ms ±0.014 | 0.167ms ±0.0069 | 0.209ms | ~1.00x | ≈ | 15.2% | 50 |
| findUnique id | 0.222ms ±0.015 | 0.163ms ±0.029 | 0.136ms | ~1.00x | ≈ | 63.8% | 50 |
| findUnique email | 0.196ms ±0.011 | 0.114ms ±0.017 | 0.140ms | ~1.00x | ≈ | 52.8% | 50 |
| count | 0.127ms ±0.026 | 0.053ms ±0.0019 | 0.063ms | ~1.00x | ≈ | 13.9% | 50 |
| count where | 0.473ms ±0.016 | 0.271ms ±0.0067 | 0.297ms | ~1.00x | ≈ | 9.0% | 50 |
| aggregate count | 0.224ms ±0.014 | 0.164ms ±0.0097 | — | ~1.00x | ≈ | 21.2% | 50 |
| aggregate sum/avg | 0.326ms ±0.010 | 0.255ms ±0.0089 | — | ~1.00x | ≈ | 12.6% | 50 |
| aggregate where | 0.486ms ±0.023 | 0.284ms ±0.0080 | — | ~1.00x | ≈ | 10.3% | 50 |
| aggregate min/max | 0.322ms ±0.0091 | 0.254ms ±0.0089 | — | ~1.00x | ≈ | 12.6% | 50 |
| aggregate complete | 0.419ms ±0.011 | 0.304ms ±0.011 | — | ~1.00x | ≈ | 12.7% | 50 |
| groupBy | 0.433ms ±0.013 | 0.359ms ±0.011 | — | ~1.00x | ≈ | 11.1% | 50 |
| groupBy count | 0.498ms ±0.021 | 0.412ms ±0.018 | — | ~1.00x | ≈ | 15.8% | 50 |
| groupBy multi | 0.601ms ±0.012 | 0.460ms ±0.011 | — | ~1.00x | ≈ | 8.2% | 50 |
| groupBy having | 0.560ms ±0.012 | 0.516ms ±0.028 | — | ~1.00x | ≈ | 19.5% | 50 |
| groupBy + where | 0.559ms ±0.012 | 0.384ms ±0.016 | — | ~1.00x | ≈ | 14.6% | 50 |
| _count via include | 0.712ms ±0.027 | 0.698ms ±0.024 | — | ~1.00x | ≈ | 12.1% | 50 |
| _count via include + relations | 1.68ms ±0.041 | 1.69ms ±0.119 | — | ~1.00x | ≈ | 25.5% | 50 |
| groupBy aggregates | 0.669ms ±0.080 | 0.452ms ±0.017 | — | ~1.00x | ≈ | 13.2% | 50 |
| groupBy min/max | 0.595ms ±0.045 | 0.485ms ±0.053 | — | ~1.00x | ≈ | 39.7% | 50 |
| include list + nested to-one | 1.76ms ±0.116 | 0.448ms ±0.033 | — | 3.92x | *** | 26.6% | 50 |
| include list + nullable to-one | 2.66ms ±0.040 | 1.83ms ±0.271 | — | ~1.00x | ≈ | 53.3% | 50 |
| include posts | 5.30ms ±1.31 | 2.13ms ±0.142 | 5.45ms | 2.49x 2.56x D | *** | 24.1% | 50 |
| include profile | 0.794ms ±0.088 | 0.472ms ±0.046 | 0.580ms | ~1.00x | ≈ | 35.0% | 50 |
| include 3 levels | 2.56ms ±0.333 | 1.63ms ±0.142 | 1.63ms | ~1.00x | ≈ | 31.4% | 50 |
| include 4 levels | 2.33ms ±0.102 | 1.07ms ±0.028 | 1.50ms | 2.17x 1.40x D | *** | 9.5% | 50 |
| include + where | 1.34ms ±0.038 | 0.796ms ±0.034 | 1.85ms | ~1.00x | ≈ | 15.2% | 50 |
| include + select nested | 1.51ms ±0.076 | 1.73ms ±0.131 | 1.76ms | ~1.00x | ≈ | 27.3% | 50 |
| findMany startsWith | 0.251ms ±0.020 | 0.178ms ±0.019 | 0.192ms | ~1.00x | ≈ | 39.4% | 50 |
| findMany endsWith | 0.745ms ±0.115 | 0.274ms ±0.039 | 0.356ms | ~1.00x | ≈ | 52.0% | 50 |
| findMany NOT contains | 1.00ms ±0.305 | 0.283ms ±0.040 | 0.370ms | ~1.00x | ≈ | 50.3% | 50 |
| findMany LIKE | 0.301ms ±0.079 | 0.170ms ±0.014 | 0.211ms | ~1.00x | ≈ | 30.3% | 50 |
| findMany < | 29.00ms ±0.735 | 6.89ms ±0.323 | 10.36ms | 4.21x 1.50x D | *** | 16.9% | 50 |
| findMany <= | 35.14ms ±3.06 | 6.75ms ±0.312 | 11.66ms | 5.21x 1.73x D | *** | 16.7% | 50 |
| findMany > | 16.68ms ±0.469 | 4.30ms ±0.211 | 6.95ms | 3.88x 1.62x D | *** | 17.8% | 50 |
| findMany NOT IN | 0.628ms ±0.031 | 0.489ms ±0.123 | 0.431ms | ~1.00x | ≈ | 90.9% | 50 |
| findMany isNot null | 0.621ms ±0.015 | 0.213ms ±0.0086 | 0.333ms | ~1.00x | ≈ | 14.5% | 50 |
| orderBy multi-field | 3.10ms ±0.119 | 0.936ms ±0.093 | 0.777ms | 3.32x 0.83x D | *** | 35.9% | 50 |
| orderBy relation to-one | 2.06ms ±0.047 | 1.52ms ±0.039 | — | ~1.00x | ≈ | 9.3% | 50 |
| orderBy relation + scalar | 2.14ms ±0.049 | 1.55ms ±0.063 | — | ~1.00x | ≈ | 14.7% | 50 |
| orderBy nullable relation | 1.86ms ±0.034 | 1.19ms ±0.032 | — | ~1.00x | ≈ | 9.9% | 50 |
| orderBy deep relation | 3.12ms ±0.292 | 1.70ms ±0.037 | — | 1.83x | *** | 7.9% | 50 |
| orderBy deep relation + scalar | 3.85ms ±0.423 | 2.68ms ±0.262 | — | 1.44x | *** | 35.2% | 50 |
| distinct status | 10.83ms ±0.417 | 1.27ms ±0.041 | — | 8.56x | *** | 11.8% | 50 |
| distinct multi | 17.93ms ±2.05 | 2.72ms ±0.125 | — | 6.59x | *** | 16.6% | 50 |
| cursor composite tuple | 1.77ms ±0.052 | 1.31ms ±0.039 | — | ~1.00x | ≈ | 10.6% | 50 |
| cursor composite desc | 1.95ms ±0.065 | 1.82ms ±0.159 | — | ~1.00x | ≈ | 31.4% | 50 |
| cursor prefix of orderBy | 1.80ms ±0.058 | 1.31ms ±0.043 | — | ~1.00x | ≈ | 11.8% | 50 |
| select + include | 1.16ms ±0.070 | 0.766ms ±0.132 | 0.375ms | ~1.00x | ≈ | 62.4% | 50 |
| _count relation | 0.844ms ±0.034 | 0.671ms ±0.044 | — | ~1.00x | ≈ | 23.9% | 50 |
| _count multi-relation | 0.256ms ±0.013 | 0.174ms ±0.0097 | — | ~1.00x | ≈ | 20.2% | 50 |
| _count inside include | 1.32ms ±0.033 | 1.25ms ±0.051 | — | ~1.00x | ≈ | 14.7% | 50 |
| _count inside nested select | 2.25ms ±0.043 | 2.00ms ±0.078 | — | ~1.00x | ≈ | 14.0% | 50 |
| _count deep include | 2.05ms ±0.046 | 1.45ms ±0.077 | — | ~1.00x | ≈ | 19.2% | 50 |
| ILIKE special chars | 0.283ms ±0.015 | 0.224ms ±0.018 | — | ~1.00x | ≈ | 28.6% | 50 |
| LIKE case sensitive | 0.262ms ±0.028 | 0.190ms ±0.018 | — | ~1.00x | ≈ | 34.6% | 50 |
| findMany Date range | 0.404ms ±0.025 | 0.534ms ±0.019 | 0.603ms | ~1.00x | ≈ | 13.0% | 50 |
| count Date range | 0.524ms ±0.030 | 0.411ms ±0.019 | 0.451ms | ~1.00x | ≈ | 16.8% | 50 |
| findMany Date gte | 0.413ms ±0.027 | 0.208ms ±0.0086 | 0.276ms | ~1.00x | ≈ | 14.7% | 50 |
| depth-1 low-fan | 0.445ms ±0.017 | 0.265ms ±0.023 | — | ~1.00x | ≈ | 31.4% | 50 |
| depth-1 mid-fan | 2.76ms ±0.092 | 2.08ms ±0.080 | — | ~1.00x | ≈ | 13.9% | 50 |
| depth-1 high-fan | 2.38ms ±0.072 | 1.96ms ±0.059 | — | ~1.00x | ≈ | 10.8% | 50 |
| depth-1 wide | 2.22ms ±0.044 | 1.41ms ±0.044 | — | ~1.00x | ≈ | 11.2% | 50 |
| depth-1 unbound | 43.88ms ±0.708 | 10.39ms ±0.320 | — | 4.22x | *** | 11.1% | 50 |
| depth-2 | 5.04ms ±0.290 | 2.91ms ±0.177 | — | 1.73x | *** | 22.0% | 50 |
| depth-2 paginated Project→tasks | 1.78ms ±0.188 | 1.87ms ±0.183 | — | ~1.00x | ≈ | 35.4% | 50 |
| depth-2 high-fan | 2.85ms ±0.113 | 1.30ms ±0.083 | — | 2.19x | *** | 22.9% | 50 |
| depth-2 wide | 5.02ms ±0.246 | 1.94ms ±0.061 | — | 2.58x | *** | 11.3% | 50 |
| depth-2 unbound | 66.25ms ±1.47 | 14.93ms ±0.817 | — | 4.44x | *** | 8.8% | 10 |
| depth-3 unbound | 18.86ms ±4.30 | 5.90ms ±0.303 | — | 3.19x | *** | 18.5% | 50 |
| depth-3 paginated | 2.07ms ±0.150 | 1.40ms ±0.104 | — | ~1.00x | ≈ | 26.9% | 50 |
| depth-4 unbound | 10.24ms ±0.442 | 4.34ms ±0.168 | — | 2.36x | *** | 14.0% | 50 |
| depth-4 paginated | 2.46ms ±0.193 | 1.79ms ±0.249 | — | ~1.00x | ≈ | 50.2% | 50 |
| findFirst depth-2 | 2.23ms ±0.079 | 1.71ms ±0.071 | — | ~1.00x | ≈ | 15.0% | 50 |
| findUnique depth-2 Project→tasks→comment | 2.37ms ±0.202 | 2.05ms ±0.135 | — | ~1.00x | ≈ | 23.8% | 50 |
| complex nested select | 3.56ms ±0.170 | 3.49ms ±0.440 | — | ~1.00x | ≈ | 45.5% | 50 |
| ultra deep query | 15.31ms ±0.248 | 6.71ms ±0.310 | — | 2.28x | *** | 16.7% | 50 |
| transaction: (3 operations) | 2.79ms ±0.059 | 1.36ms ±0.025 | — | 2.05x | *** | 6.5% | 50 |
| 测试 | Prisma | prisma-sql | Drizzle | 加速比 | 显著性 | CV% | n |
|---|---|---|---|---|---|---|---|
| findMany basic | 0.449ms ±0.013 | 0.108ms ±0.066 | 0.156ms | ~1.00x | ≈ | 221.8% | 50 |
| findMany where = | 0.612ms ±0.391 | 0.071ms ±0.020 | 0.112ms | ~1.00x | ≈ | 99.2% | 50 |
| findMany where >= | 14.32ms ±0.216 | 1.06ms ±0.062 | 2.32ms | 13.53x 2.20x D | *** | 21.2% | 50 |
| findMany where IN | 0.455ms ±0.016 | 0.053ms ±0.011 | 0.136ms | ~1.00x | ≈ | 77.0% | 50 |
| findMany where null | 0.180ms ±0.011 | 0.016ms ±0.0006 | 0.059ms | ~1.00x | ≈ | 14.6% | 50 |
| findMany AND | 1.68ms ±0.023 | 0.272ms ±0.0080 | 0.473ms | 6.18x 1.74x D | *** | 10.8% | 50 |
| findMany OR | 11.47ms ±0.109 | 0.970ms ±0.052 | 2.05ms | 11.82x 2.11x D | *** | 19.2% | 50 |
| findMany NOT | 0.475ms ±0.028 | 0.060ms ±0.011 | 0.102ms | ~1.00x | ≈ | 67.0% | 50 |
| findMany orderBy | 2.38ms ±0.032 | 1.81ms ±0.016 | 1.91ms | ~1.00x | ≈ | 3.1% | 50 |
| findMany pagination | 0.198ms ±0.035 | 0.031ms ±0.0019 | 0.063ms | ~1.00x | ≈ | 21.9% | 50 |
| findMany select | 0.188ms ±0.0072 | 0.025ms ±0.0017 | 0.040ms | ~1.00x | ≈ | 23.3% | 50 |
| findMany relation some | 4.75ms ±0.043 | 0.459ms ±0.013 | — | 10.35x | *** | 10.5% | 50 |
| findMany relation every | 9.96ms ±0.094 | 6.42ms ±0.043 | — | 1.55x | *** | 2.4% | 50 |
| findMany relation none | 178.33ms ±2.00 | 2.66ms ±0.265 | — | 67.09x | *** | 16.1% | 10 |
| findMany nested relation | 1.20ms ±0.114 | 0.332ms ±0.0083 | — | ~1.00x | ≈ | 9.0% | 50 |
| findMany complex | 0.935ms ±0.032 | 0.403ms ±0.0097 | 0.472ms | ~1.00x | ≈ | 8.6% | 50 |
| findFirst | 0.175ms ±0.014 | 0.013ms ±0.0008 | 0.067ms | ~1.00x | ≈ | 23.1% | 50 |
| findFirst skip | 0.236ms ±0.021 | 0.015ms ±0.0022 | 0.083ms | ~1.00x | ≈ | 50.9% | 50 |
| findUnique id | 0.247ms ±0.124 | 0.011ms ±0.0006 | 0.063ms | ~1.00x | ≈ | 15.4% | 50 |
| findUnique email | 0.150ms ±0.041 | 0.010ms ±0.0003 | 0.054ms | ~1.00x | ≈ | 7.3% | 50 |
| count | 0.061ms ±0.0036 | 0.0080ms ±0.0025 | 0.015ms | ~1.00x | ≈ | 110.0% | 50 |
| count where | 0.274ms ±0.0078 | 0.152ms ±0.0014 | 0.170ms | ~1.00x | ≈ | 3.6% | 50 |
| _count via include | 0.564ms ±0.012 | 0.377ms ±0.0075 | — | ~1.00x | ≈ | 7.0% | 50 |
| _count via include + relations | 1.16ms ±0.023 | 0.677ms ±0.029 | — | ~1.00x | ≈ | 15.2% | 50 |
| aggregate count | 0.159ms ±0.0058 | 0.015ms ±0.0003 | — | ~1.00x | ≈ | 9.4% | 50 |
| aggregate sum/avg | 0.299ms ±0.013 | 0.157ms ±0.0047 | — | ~1.00x | ≈ | 10.9% | 50 |
| aggregate where | 0.268ms ±0.0078 | 0.155ms ±0.0019 | — | ~1.00x | ≈ | 4.4% | 50 |
| aggregate min/max | 0.300ms ±0.0058 | 0.159ms ±0.0008 | — | ~1.00x | ≈ | 1.9% | 50 |
| aggregate complete | 0.405ms ±0.0100 | 0.231ms ±0.0067 | — | ~1.00x | ≈ | 10.3% | 50 |
| groupBy | 0.573ms ±0.0091 | 0.450ms ±0.0091 | — | ~1.00x | ≈ | 7.3% | 50 |
| groupBy count | 0.633ms ±0.017 | 0.470ms ±0.0080 | — | ~1.00x | ≈ | 6.3% | 50 |
| groupBy multi | 1.25ms ±0.029 | 1.02ms ±0.014 | — | ~1.00x | ≈ | 5.0% | 50 |
| groupBy having | 0.670ms ±0.014 | 0.489ms ±0.0067 | — | ~1.00x | ≈ | 4.9% | 50 |
| groupBy + where | 0.343ms ±0.0089 | 0.198ms ±0.0030 | — | ~1.00x | ≈ | 5.8% | 50 |
| groupBy aggregates | 0.753ms ±0.014 | 0.574ms ±0.0100 | — | ~1.00x | ≈ | 6.3% | 50 |
| groupBy min/max | 0.846ms ±0.093 | 0.584ms ±0.0094 | — | ~1.00x | ≈ | 5.8% | 50 |
| include posts | 2.19ms ±0.035 | 0.353ms ±0.021 | 1.39ms | 6.19x 3.93x D | *** | 20.9% | 50 |
| include profile | 0.348ms ±0.014 | 0.055ms ±0.0044 | 0.222ms | ~1.00x | ≈ | 28.2% | 50 |
| include 3 levels | 1.22ms ±0.033 | 1.34ms ±0.041 | 0.876ms | ~1.00x | ≈ | 11.1% | 50 |
| include 4 levels | 2.27ms ±0.797 | 1.72ms ±0.193 | 0.681ms | ~1.00x | ≈ | 40.5% | 50 |
| include + where | 0.851ms ±0.024 | 0.297ms ±0.027 | 0.307ms | ~1.00x | ≈ | 33.4% | 50 |
| include + select nested | 0.826ms ±0.041 | 0.281ms ±0.026 | 1.02ms | ~1.00x | ≈ | 33.5% | 50 |
| findMany startsWith | 0.179ms ±0.0055 | 0.026ms ±0.0008 | 0.068ms | ~1.00x | ≈ | 11.6% | 50 |
| findMany endsWith | 0.524ms ±0.026 | 0.063ms ±0.0058 | 0.115ms | ~1.00x | ≈ | 32.4% | 50 |
| findMany NOT contains | 0.571ms ±0.032 | 0.040ms ±0.0008 | 0.129ms | ~1.00x | ≈ | 6.9% | 50 |
| findMany LIKE | 0.176ms ±0.0039 | 0.026ms ±0.0008 | 0.062ms | ~1.00x | ≈ | 11.6% | 50 |
| findMany < | 24.53ms ±0.315 | 1.99ms ±0.118 | 4.02ms | 12.34x 2.02x D | *** | 21.5% | 50 |
| findMany <= | 25.42ms ±0.264 | 2.04ms ±0.114 | 4.07ms | 12.48x 2.00x D | *** | 20.2% | 50 |
| findMany > | 13.80ms ±0.504 | 1.00ms ±0.055 | 2.02ms | 13.74x 2.01x D | *** | 19.7% | 50 |
| findMany NOT IN | 0.466ms ±0.017 | 0.043ms ±0.0039 | 0.103ms | ~1.00x | ≈ | 32.2% | 50 |
| findMany isNot null | 0.469ms ±0.0080 | 0.035ms ±0.0008 | 0.117ms | ~1.00x | ≈ | 9.6% | 50 |
| orderBy multi-field | 0.711ms ±0.020 | 0.381ms ±0.0075 | 0.429ms | ~1.00x | ≈ | 7.2% | 50 |
| orderBy relation to-one | 0.749ms ±0.136 | 0.314ms ±0.011 | — | ~1.00x | ≈ | 12.1% | 50 |
| orderBy relation + scalar | 0.788ms ±0.015 | 0.391ms ±0.0089 | — | ~1.00x | ≈ | 8.1% | 50 |
| orderBy nullable relation | 0.659ms ±0.012 | 0.324ms ±0.0061 | — | ~1.00x | ≈ | 6.7% | 50 |
| orderBy deep relation | 0.773ms ±0.028 | 0.380ms ±0.0058 | — | ~1.00x | ≈ | 5.6% | 50 |
| orderBy deep relation + scalar | 1.15ms ±0.030 | 0.686ms ±0.012 | — | ~1.00x | ≈ | 6.5% | 50 |
| distinct status | 13.32ms ±0.479 | 4.21ms ±0.032 | — | 3.16x | *** | 2.8% | 50 |
| distinct multi | 14.27ms ±0.337 | 5.20ms ±0.052 | — | 2.74x | *** | 3.6% | 50 |
| select + include | 0.595ms ±0.019 | 0.249ms ±0.0094 | 0.138ms | ~1.00x | ≈ | 13.8% | 50 |
| _count relation | 0.669ms ±0.026 | 0.348ms ±0.0089 | — | ~1.00x | ≈ | 9.1% | 50 |
| _count multi-relation | 0.170ms ±0.0086 | 0.050ms ±0.0014 | — | ~1.00x | ≈ | 9.1% | 50 |
| _count inside include | 0.925ms ±0.023 | 0.534ms ±0.0086 | — | ~1.00x | ≈ | 5.8% | 50 |
| _count inside nested select | 1.63ms ±0.023 | 1.21ms ±0.017 | — | ~1.00x | ≈ | 5.2% | 50 |
| _count deep include | 1.41ms ±0.026 | 1.22ms ±0.030 | — | ~1.00x | ≈ | 8.8% | 50 |
| findMany Date range | 0.284ms ±0.011 | 0.041ms ±0.0055 | 0.238ms | ~1.00x | ≈ | 48.3% | 50 |
| findMany Date gte | 0.276ms ±0.016 | 0.035ms ±0.0006 | 0.110ms | ~1.00x | ≈ | 5.3% | 50 |
| depth-1 low-fan Project→labels | 0.270ms ±0.0075 | 0.051ms ±0.0011 | — | ~1.00x | ≈ | 7.2% | 50 |
| depth-1 mid-fan Project→tasks | 2.11ms ±0.030 | 0.329ms ±0.019 | — | 6.41x | *** | 20.8% | 50 |
| depth-1 high-fan User→assignedTasks | 1.79ms ±0.022 | 0.302ms ±0.0100 | — | 5.93x | *** | 11.8% | 50 |
| depth-1 wide | 1.57ms ±0.022 | 0.326ms ±0.022 | — | 4.84x | *** | 24.7% | 50 |
| depth-1 no-limit Project→tasks | 38.25ms ±0.536 | 3.37ms ±0.108 | — | 11.36x | *** | 11.5% | 50 |
| depth-2 | 1.94ms ±0.032 | 0.429ms ±0.027 | — | 4.52x | *** | 22.9% | 50 |
| depth-2 paginated | 0.978ms ±0.022 | 0.421ms ±0.031 | — | ~1.00x | ≈ | 26.8% | 50 |
| depth-2 high-fan | 1.73ms ±0.031 | 0.391ms ±0.030 | — | 4.43x | *** | 28.0% | 50 |
| depth-2 wide+attach+activity | 2.10ms ±0.039 | 0.523ms ±0.037 | — | 4.02x | *** | 25.4% | 50 |
| depth-2 no-limit | 54.36ms ±0.345 | 7.22ms ±0.373 | — | 7.53x | *** | 8.3% | 10 |
| depth-3 | 11.86ms ±0.609 | 1.30ms ±0.039 | — | 9.11x | *** | 10.8% | 50 |
| depth-3 paginated | 1.22ms ±0.025 | 1.30ms ±0.043 | — | ~1.00x | ≈ | 11.9% | 50 |
| depth-4 | 6.81ms ±0.255 | 1.41ms ±0.217 | — | 4.82x | *** | 55.5% | 50 |
| depth-4 paginated | 1.24ms ±0.033 | 1.57ms ±0.052 | — | ~1.00x | ≈ | 12.0% | 50 |
| findFirst depth-2 | 1.04ms ±0.028 | 0.260ms ±0.0055 | — | ~1.00x | ≈ | 7.7% | 50 |
| findUnique depth-2 | 1.00ms ±0.025 | 0.272ms ±0.031 | — | ~1.00x | ≈ | 41.4% | 50 |
| 测试 | Prisma | prisma-sql | Drizzle | 加速比 | 显著性 | CV% | n |
|---|---|---|---|---|---|---|---|
| findMany basic | 0.334ms ±0.044 | 0.263ms ±0.045 | 0.320ms | ~1.00x | ≈ | 62.0% | 50 |
| findMany where = | 0.303ms ±0.038 | 0.291ms ±0.021 | 0.461ms | ~1.00x | ≈ | 26.5% | 50 |
| findMany where >= | 9.19ms ±0.691 | 5.13ms ±0.354 | 6.77ms | 1.79x 1.32x D | *** | 24.9% | 50 |
| findMany where IN | 0.454ms ±0.046 | 0.616ms ±0.124 | 0.467ms | ~1.00x | ≈ | 72.8% | 50 |
| findMany where null | 0.269ms ±0.094 | 0.143ms ±0.0055 | 0.181ms | ~1.00x | ≈ | 14.0% | 50 |
| findMany ILIKE | 0.209ms ±0.118 | 0.230ms ±0.049 | 0.163ms | ~1.00x | ≈ | 76.9% | 50 |
| findMany AND | 1.78ms ±0.141 | 0.611ms ±0.056 | 1.73ms | 2.92x 2.82x D | *** | 32.9% | 50 |
| findMany OR | 7.09ms ±0.288 | 4.23ms ±0.354 | 6.24ms | 1.68x 1.48x D | *** | 30.2% | 50 |
| findMany NOT | 0.362ms ±0.044 | 0.345ms ±0.020 | 0.446ms | ~1.00x | ≈ | 21.2% | 50 |
| findMany orderBy | 2.08ms ±0.058 | 0.563ms ±0.065 | 0.900ms | 3.70x 1.60x D | *** | 41.8% | 50 |
| findMany pagination | 0.166ms ±0.012 | 0.209ms ±0.023 | 0.252ms | ~1.00x | ≈ | 39.8% | 50 |
| findMany select | 0.152ms ±0.011 | 0.145ms ±0.025 | 0.118ms | ~1.00x | ≈ | 62.9% | 50 |
| findMany relation some | 0.607ms ±0.052 | 0.459ms ±0.014 | — | ~1.00x | ≈ | 11.2% | 50 |
| findMany relation every | 0.570ms ±0.013 | 0.484ms ±0.029 | — | ~1.00x | ≈ | 21.6% | 50 |
| findMany relation none | 12.33ms ±0.567 | 6.67ms ±0.365 | — | 1.85x | *** | 19.7% | 50 |
| findMany nested relation | 0.567ms ±0.014 | 0.539ms ±0.040 | — | ~1.00x | ≈ | 27.1% | 50 |
| findMany complex | 0.782ms ±0.044 | 0.529ms ±0.021 | 0.574ms | ~1.00x | ≈ | 14.2% | 50 |
| findFirst | 0.141ms ±0.010 | 0.213ms ±0.053 | 0.231ms | ~1.00x | ≈ | 89.3% | 50 |
| findFirst skip | 0.825ms ±0.313 | 0.168ms ±0.0055 | 0.674ms | ~1.00x | ≈ | 11.9% | 50 |
| findUnique id | 0.155ms ±0.013 | 0.170ms ±0.015 | 0.158ms | ~1.00x | ≈ | 32.3% | 50 |
| findUnique email | 0.115ms ±0.0078 | 0.126ms ±0.035 | 0.146ms | ~1.00x | ≈ | 100.9% | 50 |
| count | 0.116ms ±0.022 | 0.053ms ±0.0019 | 0.064ms | ~1.00x | ≈ | 13.2% | 50 |
| count where | 0.385ms ±0.026 | 0.266ms ±0.013 | 0.275ms | ~1.00x | ≈ | 18.2% | 50 |
| aggregate count | 0.188ms ±0.0050 | 0.145ms ±0.0075 | — | ~1.00x | ≈ | 18.7% | 50 |
| aggregate sum/avg | 0.286ms ±0.010 | 0.246ms ±0.0080 | — | ~1.00x | ≈ | 11.6% | 50 |
| aggregate where | 0.583ms ±0.100 | 0.282ms ±0.015 | — | ~1.00x | ≈ | 19.7% | 50 |
| aggregate min/max | 0.322ms ±0.028 | 0.335ms ±0.039 | — | ~1.00x | ≈ | 41.8% | 50 |
| aggregate complete | 0.360ms ±0.017 | 0.286ms ±0.0094 | — | ~1.00x | ≈ | 12.0% | 50 |
| groupBy | 0.420ms ±0.023 | 0.385ms ±0.018 | — | ~1.00x | ≈ | 16.6% | 50 |
| groupBy count | 0.432ms ±0.015 | 0.373ms ±0.0067 | — | ~1.00x | ≈ | 6.5% | 50 |
| groupBy multi | 0.500ms ±0.012 | 0.469ms ±0.015 | — | ~1.00x | ≈ | 11.7% | 50 |
| groupBy having | 0.442ms ±0.017 | 0.512ms ±0.052 | — | ~1.00x | ≈ | 36.9% | 50 |
| groupBy + where | 0.475ms ±0.012 | 0.348ms ±0.017 | — | ~1.00x | ≈ | 17.7% | 50 |
| _count via include | 0.637ms ±0.027 | 0.672ms ±0.024 | — | ~1.00x | ≈ | 12.8% | 50 |
| _count via include + relations | 1.40ms ±0.115 | 1.54ms ±0.123 | — | ~1.00x | ≈ | 28.8% | 50 |
| groupBy aggregates | 0.488ms ±0.020 | 0.459ms ±0.019 | — | ~1.00x | ≈ | 14.9% | 50 |
| groupBy min/max | 0.497ms ±0.041 | 0.435ms ±0.025 | — | ~1.00x | ≈ | 21.0% | 50 |
| include list + nested to-one | 1.24ms ±0.198 | 0.405ms ±0.022 | — | ~1.00x | ≈ | 19.5% | 50 |
| include list + nullable to-one | 1.74ms ±0.197 | 1.99ms ±0.332 | — | ~1.00x | ≈ | 60.2% | 50 |
| include posts | 1.52ms ±0.149 | 2.43ms ±0.673 | 2.66ms | ~1.00x | ≈ | 100.0% | 50 |
| include profile | 0.277ms ±0.018 | 0.344ms ±0.040 | 0.488ms | ~1.00x | ≈ | 42.2% | 50 |
| include 3 levels | 1.61ms ±0.163 | 1.21ms ±0.047 | 1.59ms | ~1.00x | ≈ | 13.9% | 50 |
| include 4 levels | 1.54ms ±0.061 | 1.08ms ±0.029 | 1.48ms | ~1.00x | ≈ | 9.6% | 50 |
| include + where | 0.859ms ±0.093 | 0.836ms ±0.049 | 1.76ms | ~1.00x | ≈ | 21.0% | 50 |
| include + select nested | 0.781ms ±0.106 | 1.61ms ±0.176 | 1.71ms | ~1.00x | ≈ | 39.3% | 50 |
| findMany startsWith | 0.122ms ±0.0075 | 0.187ms ±0.029 | 0.192ms | ~1.00x | ≈ | 55.7% | 50 |
| findMany endsWith | 0.277ms ±0.037 | 0.302ms ±0.039 | 0.327ms | ~1.00x | ≈ | 46.4% | 50 |
| findMany NOT contains | 0.246ms ±0.035 | 0.225ms ±0.031 | 0.271ms | ~1.00x | ≈ | 50.1% | 50 |
| findMany LIKE | 0.122ms ±0.053 | 0.121ms ±0.023 | 0.135ms | ~1.00x | ≈ | 69.3% | 50 |
| findMany < | 12.52ms ±0.391 | 6.14ms ±0.254 | 10.17ms | 2.04x 1.66x D | *** | 14.9% | 50 |
| findMany <= | 13.07ms ±0.470 | 6.59ms ±0.268 | 10.29ms | 1.98x 1.56x D | *** | 14.7% | 50 |
| findMany > | 7.52ms ±0.369 | 4.25ms ±0.164 | 6.46ms | 1.77x 1.52x D | *** | 14.0% | 50 |
| findMany NOT IN | 0.364ms ±0.042 | 0.348ms ±0.0094 | 0.365ms | ~1.00x | ≈ | 9.7% | 50 |
| findMany isNot null | 0.249ms ±0.040 | 0.207ms ±0.0067 | 0.230ms | ~1.00x | ≈ | 11.8% | 50 |
| orderBy multi-field | 1.93ms ±0.040 | 0.561ms ±0.035 | 0.653ms | 3.44x 1.16x D | *** | 22.6% | 50 |
| orderBy relation to-one | 1.87ms ±0.085 | 1.34ms ±0.017 | — | ~1.00x | ≈ | 4.7% | 50 |
| orderBy relation + scalar | 2.08ms ±0.036 | 1.61ms ±0.058 | — | ~1.00x | ≈ | 12.9% | 50 |
| orderBy nullable relation | 1.83ms ±0.100 | 1.33ms ±0.050 | — | ~1.00x | ≈ | 13.6% | 50 |
| orderBy deep relation | 1.94ms ±0.033 | 1.70ms ±0.165 | — | ~1.00x | ≈ | 35.0% | 50 |
| orderBy deep relation + scalar | 2.30ms ±0.024 | 1.96ms ±0.051 | — | ~1.00x | ≈ | 9.4% | 50 |
| distinct status | 7.96ms ±0.110 | 1.11ms ±0.015 | — | 7.15x | *** | 4.8% | 50 |
| distinct multi | 11.29ms ±0.146 | 2.38ms ±0.034 | — | 4.73x | *** | 5.1% | 50 |
| cursor composite tuple | 1.64ms ±0.048 | 1.27ms ±0.032 | — | ~1.00x | ≈ | 9.0% | 50 |
| cursor composite desc | 1.72ms ±0.098 | 1.46ms ±0.049 | — | ~1.00x | ≈ | 12.2% | 50 |
| cursor prefix of orderBy | 1.77ms ±0.134 | 1.76ms ±0.357 | — | ~1.00x | ≈ | 73.1% | 50 |
| select + include | 0.654ms ±0.045 | 0.754ms ±0.049 | 0.336ms | ~1.00x | ≈ | 23.5% | 50 |
| _count relation | 0.588ms ±0.016 | 0.594ms ±0.023 | — | ~1.00x | ≈ | 14.0% | 50 |
| _count multi-relation | 0.193ms ±0.016 | 0.169ms ±0.010 | — | ~1.00x | ≈ | 22.0% | 50 |
| _count inside include | 1.11ms ±0.161 | 1.21ms ±0.058 | — | ~1.00x | ≈ | 17.5% | 50 |
| _count inside nested select | 1.46ms ±0.043 | 1.71ms ±0.062 | — | ~1.00x | ≈ | 13.1% | 50 |
| _count deep include | 1.66ms ±0.058 | 1.33ms ±0.022 | — | ~1.00x | ≈ | 5.9% | 50 |
| ILIKE special chars | 0.216ms ±0.041 | 0.232ms ±0.040 | — | ~1.00x | ≈ | 62.0% | 50 |
| LIKE case sensitive | 0.129ms ±0.030 | 0.225ms ±0.039 | — | ~1.00x | ≈ | 61.7% | 50 |
| findMany Date range | 1.38ms ±0.032 | 0.532ms ±0.032 | 0.617ms | ~1.00x | ≈ | 21.9% | 50 |
| count Date range | 0.426ms ±0.020 | 0.430ms ±0.025 | 0.440ms | ~1.00x | ≈ | 21.2% | 50 |
| findMany Date gte | 0.198ms ±0.033 | 0.194ms ±0.011 | 0.246ms | ~1.00x | ≈ | 20.0% | 50 |
| depth-1 low-fan | 0.251ms ±0.039 | 0.206ms ±0.015 | — | ~1.00x | ≈ | 25.7% | 50 |
| depth-1 mid-fan | 1.23ms ±0.082 | 1.88ms ±0.022 | — | ~1.00x | ≈ | 4.2% | 50 |
| depth-1 high-fan | 1.13ms ±0.100 | 1.85ms ±0.060 | — | ~1.00x | ≈ | 11.7% | 50 |
| depth-1 wide | 0.983ms ±0.093 | 1.35ms ±0.022 | — | ~1.00x | ≈ | 5.9% | 50 |
| depth-1 unbound | 19.24ms ±0.553 | 9.95ms ±0.338 | — | 1.93x | *** | 12.3% | 50 |
| depth-2 | 3.37ms ±0.200 | 2.86ms ±0.168 | — | ~1.00x | ≈ | 21.1% | 50 |
| depth-2 paginated Project→tasks | 1.45ms ±0.120 | 2.29ms ±0.308 | — | ~1.00x | ≈ | 48.5% | 50 |
| depth-2 high-fan | 1.50ms ±0.174 | 1.67ms ±0.145 | — | ~1.00x | ≈ | 31.3% | 50 |
| depth-2 wide | 1.86ms ±0.302 | 1.40ms ±0.098 | — | ~1.00x | ≈ | 25.1% | 50 |
| depth-2 unbound | 30.84ms ±0.983 | 15.71ms ±0.606 | — | 1.96x | *** | 13.9% | 50 |
| depth-3 unbound | 10.50ms ±0.565 | 7.56ms ±0.512 | — | 1.39x | *** | 24.4% | 50 |
| depth-3 paginated | 1.45ms ±0.088 | 1.65ms ±0.185 | — | ~1.00x | ≈ | 40.3% | 50 |
| depth-4 unbound | 4.23ms ±0.353 | 2.95ms ±0.142 | — | 1.43x | *** | 17.4% | 50 |
| depth-4 paginated | 1.39ms ±0.054 | 1.45ms ±0.188 | — | ~1.00x | ≈ | 46.7% | 50 |
| findFirst depth-2 | 0.898ms ±0.063 | 0.999ms ±0.060 | — | ~1.00x | ≈ | 21.6% | 50 |
| findUnique depth-2 Project→tasks→comment | 0.896ms ±0.062 | 0.947ms ±0.055 | — | ~1.00x | ≈ | 20.9% | 50 |
| complex nested select | 3.12ms ±0.094 | 2.48ms ±0.073 | — | ~1.00x | ≈ | 10.6% | 50 |
| ultra deep query | 6.64ms ±0.165 | 5.64ms ±0.108 | — | 1.18x | *** | 6.9% | 50 |
| transaction: (3 operations) | 2.52ms ±0.109 | 1.36ms ±0.027 | — | 1.85x | *** | 7.2% | 50 |
| 测试 | Prisma | prisma-sql | Drizzle | 加速比 | 显著性 | CV% | n |
|---|---|---|---|---|---|---|---|
| findMany basic | 0.184ms ±0.034 | 0.054ms ±0.0083 | 0.127ms | ~1.00x | ≈ | 55.5% | 50 |
| findMany where = | 0.136ms ±0.0047 | 0.067ms ±0.041 | 0.132ms | ~1.00x | ≈ | 219.6% | 50 |
| findMany where >= | 4.69ms ±0.278 | 1.20ms ±0.071 | 2.46ms | 3.90x 2.04x D | *** | 21.2% | 50 |
| findMany where IN | 0.175ms ±0.030 | 0.068ms ±0.020 | 0.118ms | ~1.00x | ≈ | 107.6% | 50 |
| findMany where null | 0.067ms ±0.0017 | 0.016ms ±0.0006 | 0.061ms | ~1.00x | ≈ | 11.4% | 50 |
| findMany AND | 0.663ms ±0.046 | 0.321ms ±0.052 | 0.486ms | ~1.00x | ≈ | 58.7% | 50 |
| findMany OR | 3.64ms ±0.139 | 1.04ms ±0.049 | 2.17ms | 3.49x 2.08x D | *** | 16.8% | 50 |
| findMany NOT | 0.167ms ±0.013 | 0.043ms ±0.0008 | 0.131ms | ~1.00x | ≈ | 7.5% | 50 |
| findMany orderBy | 2.02ms ±0.115 | 2.09ms ±0.164 | 1.94ms | ~1.00x | ≈ | 28.4% | 50 |
| findMany pagination | 0.081ms ±0.010 | 0.030ms ±0.0019 | 0.073ms | ~1.00x | ≈ | 24.0% | 50 |
| findMany select | 0.093ms ±0.021 | 0.025ms ±0.0014 | 0.043ms | ~1.00x | ≈ | 21.4% | 50 |
| findMany relation some | 0.444ms ±0.038 | 0.458ms ±0.011 | — | ~1.00x | ≈ | 8.4% | 50 |
| findMany relation every | 9.70ms ±0.090 | 6.60ms ±0.047 | — | 1.47x | *** | 2.5% | 50 |
| findMany relation none | 129.94ms ±1.35 | 3.06ms ±0.414 | — | 42.46x | *** | 21.8% | 10 |
| findMany nested relation | 0.532ms ±0.097 | 0.390ms ±0.050 | — | ~1.00x | ≈ | 46.1% | 50 |
| findMany complex | 0.516ms ±0.014 | 0.437ms ±0.0100 | 0.557ms | ~1.00x | ≈ | 8.2% | 50 |
| findFirst | 0.071ms ±0.0017 | 0.012ms ±0.0006 | 0.082ms | ~1.00x | ≈ | 16.2% | 50 |
| findFirst skip | 0.080ms ±0.0011 | 0.014ms ±0.0003 | 0.080ms | ~1.00x | ≈ | 6.1% | 50 |
| findUnique id | 0.107ms ±0.069 | 0.010ms ±0.0003 | 0.056ms | ~1.00x | ≈ | 12.7% | 50 |
| findUnique email | 0.075ms ±0.0030 | 0.010ms ±0.0003 | 0.053ms | ~1.00x | ≈ | 8.4% | 50 |
| count | 0.051ms ±0.011 | 0.0090ms ±0.0030 | 0.014ms | ~1.00x | ≈ | 127.8% | 50 |
| count where | 0.231ms ±0.055 | 0.161ms ±0.0017 | 0.174ms | ~1.00x | ≈ | 3.7% | 50 |
| _count via include | 0.460ms ±0.011 | 0.378ms ±0.0072 | — | ~1.00x | ≈ | 7.0% | 50 |
| _count via include + relations | 0.824ms ±0.042 | 0.710ms ±0.055 | — | ~1.00x | ≈ | 27.9% | 50 |
| aggregate count | 0.076ms ±0.0011 | 0.017ms ±0.0011 | — | ~1.00x | ≈ | 21.7% | 50 |
| aggregate sum/avg | 0.206ms ±0.0033 | 0.160ms ±0.0047 | — | ~1.00x | ≈ | 10.4% | 50 |
| aggregate where | 0.210ms ±0.011 | 0.167ms ±0.0075 | — | ~1.00x | ≈ | 16.1% | 50 |
| aggregate min/max | 0.223ms ±0.0047 | 0.167ms ±0.0014 | — | ~1.00x | ≈ | 2.9% | 50 |
| aggregate complete | 0.331ms ±0.054 | 0.234ms ±0.0069 | — | ~1.00x | ≈ | 10.9% | 50 |
| groupBy | 0.516ms ±0.014 | 0.474ms ±0.014 | — | ~1.00x | ≈ | 11.0% | 50 |
| groupBy count | 0.524ms ±0.017 | 0.480ms ±0.017 | — | ~1.00x | ≈ | 13.2% | 50 |
| groupBy multi | 1.02ms ±0.014 | 0.964ms ±0.011 | — | ~1.00x | ≈ | 4.1% | 50 |
| groupBy having | 0.532ms ±0.014 | 0.484ms ±0.018 | — | ~1.00x | ≈ | 13.7% | 50 |
| groupBy + where | 0.235ms ±0.0075 | 0.215ms ±0.048 | — | ~1.00x | ≈ | 79.8% | 50 |
| groupBy aggregates | 0.609ms ±0.017 | 0.591ms ±0.011 | — | ~1.00x | ≈ | 6.6% | 50 |
| groupBy min/max | 0.628ms ±0.016 | 0.604ms ±0.022 | — | ~1.00x | ≈ | 13.2% | 50 |
| include posts | 0.889ms ±0.081 | 0.367ms ±0.039 | 1.43ms | ~1.00x | ≈ | 38.8% | 50 |
| include profile | 0.187ms ±0.031 | 0.065ms ±0.0075 | 0.232ms | ~1.00x | ≈ | 42.3% | 50 |
| include 3 levels | 0.700ms ±0.055 | 1.57ms ±0.107 | 0.812ms | ~1.00x | ≈ | 24.4% | 50 |
| include 4 levels | 0.731ms ±0.052 | 1.65ms ±0.053 | 0.677ms | ~1.00x | ≈ | 11.7% | 50 |
| include + where | 0.419ms ±0.016 | 0.284ms ±0.030 | 0.322ms | ~1.00x | ≈ | 38.4% | 50 |
| include + select nested | 0.378ms ±0.034 | 0.260ms ±0.0100 | 1.05ms | ~1.00x | ≈ | 13.9% | 50 |
| findMany startsWith | 0.070ms ±0.0080 | 0.027ms ±0.0006 | 0.072ms | ~1.00x | ≈ | 8.5% | 50 |
| findMany endsWith | 0.182ms ±0.063 | 0.057ms ±0.0008 | 0.153ms | ~1.00x | ≈ | 5.3% | 50 |
| findMany NOT contains | 0.175ms ±0.045 | 0.043ms ±0.0008 | 0.114ms | ~1.00x | ≈ | 6.4% | 50 |
| findMany LIKE | 0.060ms ±0.0011 | 0.025ms ±0.0008 | 0.083ms | ~1.00x | ≈ | 10.4% | 50 |
| findMany < | 7.77ms ±0.195 | 2.10ms ±0.102 | 4.26ms | 3.70x 2.03x D | *** | 17.6% | 50 |
| findMany <= | 7.86ms ±0.126 | 2.19ms ±0.099 | 6.75ms | 3.59x 3.09x D | *** | 16.4% | 50 |
| findMany > | 4.32ms ±0.160 | 1.18ms ±0.089 | 2.92ms | 3.65x 2.47x D | *** | 27.1% | 50 |
| findMany NOT IN | 0.214ms ±0.028 | 0.078ms ±0.035 | 0.136ms | ~1.00x | ≈ | 161.1% | 50 |
| findMany isNot null | 0.196ms ±0.057 | 0.039ms ±0.0008 | 0.105ms | ~1.00x | ≈ | 7.3% | 50 |
| orderBy multi-field | 0.616ms ±0.074 | 0.373ms ±0.012 | 0.546ms | ~1.00x | ≈ | 11.2% | 50 |
| orderBy relation to-one | 0.545ms ±0.081 | 0.634ms ±0.145 | — | ~1.00x | ≈ | 82.5% | 50 |
| orderBy relation + scalar | 0.717ms ±0.095 | 0.682ms ±0.068 | — | ~1.00x | ≈ | 36.0% | 50 |
| orderBy nullable relation | 0.491ms ±0.071 | 0.578ms ±0.133 | — | ~1.00x | ≈ | 83.2% | 50 |
| orderBy deep relation | 0.716ms ±0.109 | 0.441ms ±0.034 | — | ~1.00x | ≈ | 27.6% | 50 |
| orderBy deep relation + scalar | 1.05ms ±0.099 | 0.854ms ±0.054 | — | ~1.00x | ≈ | 22.9% | 50 |
| distinct status | 7.65ms ±0.187 | 4.88ms ±0.071 | — | 1.57x | *** | 5.3% | 50 |
| distinct multi | 10.41ms ±0.550 | 5.81ms ±0.072 | — | 1.79x | *** | 4.5% | 50 |
| select + include | 0.553ms ±0.094 | 0.360ms ±0.047 | 0.254ms | ~1.00x | ≈ | 46.7% | 50 |
| _count relation | 0.737ms ±0.106 | 0.521ms ±0.076 | — | ~1.00x | ≈ | 52.8% | 50 |
| _count multi-relation | 0.181ms ±0.040 | 0.069ms ±0.017 | — | ~1.00x | ≈ | 89.1% | 50 |
| _count inside include | 5.49ms ±1.40 | 0.935ms ±0.173 | — | 5.87x | *** | 66.6% | 50 |
| _count inside nested select | 2.19ms ±0.215 | 2.01ms ±0.329 | — | ~1.00x | ≈ | 59.0% | 50 |
| _count deep include | 2.24ms ±0.398 | 1.63ms ±0.220 | — | ~1.00x | ≈ | 48.9% | 50 |
| findMany Date range | 0.342ms ±0.274 | 0.068ms ±0.014 | 0.555ms | ~1.00x | ≈ | 72.9% | 50 |
| findMany Date gte | 0.106ms ±0.0100 | 0.048ms ±0.0094 | 0.100ms | ~1.00x | ≈ | 69.8% | 50 |
| depth-1 low-fan Project→labels | 0.311ms ±0.109 | 0.073ms ±0.017 | — | ~1.00x | ≈ | 83.4% | 50 |
| depth-1 mid-fan Project→tasks | 1.16ms ±0.159 | 0.437ms ±0.058 | — | ~1.00x | ≈ | 48.3% | 50 |
| depth-1 high-fan User→assignedTasks | 0.779ms ±0.081 | 0.350ms ±0.041 | — | ~1.00x | ≈ | 42.0% | 50 |
| depth-1 wide | 0.769ms ±0.070 | 0.362ms ±0.059 | — | ~1.00x | ≈ | 58.9% | 50 |
| depth-1 no-limit Project→tasks | 15.27ms ±0.845 | 4.50ms ±0.318 | — | 3.40x | *** | 25.5% | 50 |
| depth-2 | 1.61ms ±0.220 | 2.56ms ±1.15 | — | ~1.00x | ≈ | 161.2% | 50 |
| depth-2 paginated | 1.33ms ±0.269 | 0.505ms ±0.073 | — | ~1.00x | ≈ | 52.3% | 50 |
| depth-2 high-fan | 0.937ms ±0.101 | 0.836ms ±0.149 | — | ~1.00x | ≈ | 64.5% | 50 |
| depth-2 wide+attach+activity | 1.21ms ±0.121 | 0.543ms ±0.044 | — | ~1.00x | ≈ | 28.9% | 50 |
| depth-2 no-limit | 20.91ms ±0.776 | 7.91ms ±0.221 | — | 2.65x | *** | 10.1% | 50 |
| depth-3 | 4.93ms ±0.564 | 1.48ms ±0.077 | — | 3.33x | *** | 18.9% | 50 |
| depth-3 paginated | 0.690ms ±0.048 | 1.48ms ±0.060 | — | ~1.00x | ≈ | 14.6% | 50 |
| depth-4 | 2.45ms ±0.194 | 0.948ms ±0.048 | — | 2.59x | *** | 18.3% | 50 |
| depth-4 paginated | 0.742ms ±0.048 | 1.66ms ±0.065 | — | ~1.00x | ≈ | 14.3% | 50 |
| findFirst depth-2 | 0.568ms ±0.055 | 0.301ms ±0.040 | — | ~1.00x | ≈ | 47.3% | 50 |
| findUnique depth-2 | 0.603ms ±0.050 | 0.312ms ±0.061 | — | ~1.00x | ≈ | 70.2% | 50 |
绕过 Prisma 的读取执行路径,同时保留 Prisma 的 API 与类型
扩展在读取操作(findMany、findFirst、findUnique、count、aggregate、groupBy)执行前捕获它们
将 Prisma 查询转换为具有优化 JOIN 的快速参数化 SQL
通过 postgres.js 或 better-sqlite3 直接执行读取,绕过 Prisma 读取开销
结果与 Prisma 期望的结构一致。类型、IntelliSense 与现有查询代码保持不变
const users = await prisma.user.findMany({
where: { status: 'ACTIVE' },
include: { posts: true }
})
// 读取使用直接 SQL 执行
// 在该负载下基准约 ~1.00ms
// 查询代码不变 为读取获得更快的 SQL 执行速度,同时保留 Prisma 的开发体验
一次性配置即可加速 Prisma 读取。无需重构、迁移或停机。
保持完整的 TypeScript 支持。在加速读取的同时保留类型推断、自动完成与编译期安全性。
137 个端到端测试验证与较新 Prisma 版本兼容。已用于生产环境加速读取。
在 PostgreSQL(包括 Neon、Supabase)与 SQLite 上优化 Prisma 读取。
可选生成器在构建时创建 SQL,将最热查询的开销减少到微秒。
适用于 serverless Node 运行时。Edge 运行时支持取决于运行时限制与所使用的驱动。
此扩展产生实际影响的常见场景
聚合与 groupBy 往往能从直接 SQL 执行中明显受益
在高并发下固定开销会叠加,尤其是读密集端点
无服务器中每毫秒都很重要:降低读取延迟
用户能感知延迟:更快的读取能立即改善体验
在 60 秒内加速 Prisma 读取
# PostgreSQL
npm install prisma-sql postgres
# SQLite
npm install prisma-sql better-sqlite3 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 }
}) 关于优化 Prisma 读取的常见问题
Prisma 会增加开销,因为它实现了 API 层保证:基于 schema 的验证、一致的查询行为和结果整形。这些层带来更好的开发体验,但相比直接执行原始 SQL 会消耗更多时间。
使用此扩展优化读密集场景。它通过 postgres.js 或 better-sqlite3 直接执行读取 SQL,同时保持 Prisma 的 API 与类型。只需要对 Prisma Client 初始化做一次小改动,无需重构现有查询。
在很多读取负载下是的,因为存在架构性开销。此扩展的目标是在保留 Prisma DX 的同时,通过直接 SQL 执行降低读取延迟。
可以。只需在 Prisma Client 初始化时加一次扩展,现有 Prisma 查询代码无需改变。读取会更快,同时 API、类型与 schema 保持一致。
可以。它有 137 个端到端测试,并以生产使用为目标。上线前建议确认与你的 Prisma 版本兼容,并跑一遍自己的回归测试。
聚合与 groupBy 往往会放大固定开销(查询处理与结果整形),并可能涉及更大的中间数据。此扩展通过直接生成并执行 SQL 来优化这些读取,通常能降低聚合型端点延迟。