查询转换层
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.506ms ±0.014 | 0.263ms ±0.045 | 0.328ms | ~1.00x | ≈ | 61.8% | 50 |
| findMany where = | 0.537ms ±0.031 | 0.520ms ±0.186 | 0.406ms | ~1.00x | ≈ | 128.9% | 50 |
| findMany where >= | 16.63ms ±0.392 | 5.04ms ±0.245 | 6.80ms | 3.30x 1.35x D | *** | 17.5% | 50 |
| findMany where IN | 0.643ms ±0.044 | 0.349ms ±0.024 | 0.423ms | ~1.00x | ≈ | 24.3% | 50 |
| findMany where null | 0.268ms ±0.0078 | 0.172ms ±0.0100 | 0.170ms | ~1.00x | ≈ | 20.8% | 50 |
| findMany ILIKE | 0.265ms ±0.0100 | 0.255ms ±0.0091 | 0.261ms | ~1.00x | ≈ | 13.0% | 50 |
| findMany AND | 2.77ms ±0.136 | 0.906ms ±0.078 | 1.60ms | 3.06x 1.76x D | *** | 31.2% | 50 |
| findMany OR | 14.41ms ±0.382 | 4.26ms ±0.294 | 5.31ms | 3.38x 1.25x D | *** | 24.9% | 50 |
| findMany NOT | 0.594ms ±0.015 | 0.383ms ±0.045 | 0.404ms | ~1.00x | ≈ | 42.3% | 50 |
| findMany orderBy | 1.71ms ±0.026 | 0.650ms ±0.068 | 0.567ms | 2.63x 0.87x D | *** | 37.6% | 50 |
| findMany pagination | 0.225ms ±0.029 | 0.148ms ±0.020 | 0.153ms | ~1.00x | ≈ | 48.1% | 50 |
| findMany select | 0.236ms ±0.0061 | 0.149ms ±0.026 | 0.104ms | ~1.00x | ≈ | 61.8% | 50 |
| findMany relation some | 0.880ms ±0.014 | 0.477ms ±0.039 | — | ~1.00x | ≈ | 29.2% | 50 |
| findMany relation every | 0.689ms ±0.016 | 0.463ms ±0.022 | — | ~1.00x | ≈ | 17.4% | 50 |
| findMany relation none | 30.27ms ±1.35 | 7.71ms ±0.265 | — | 3.93x | *** | 12.4% | 50 |
| findMany nested relation | 0.732ms ±0.022 | 0.779ms ±0.085 | — | ~1.00x | ≈ | 39.5% | 50 |
| findMany complex | 1.08ms ±0.018 | 0.448ms ±0.012 | 0.563ms | ~1.00x | ≈ | 9.4% | 50 |
| findFirst | 0.220ms ±0.018 | 0.196ms ±0.019 | 0.170ms | ~1.00x | ≈ | 34.8% | 50 |
| findFirst skip | 0.316ms ±0.033 | 0.188ms ±0.042 | 0.170ms | ~1.00x | ≈ | 80.6% | 50 |
| findUnique id | 0.181ms ±0.011 | 0.119ms ±0.0055 | 0.149ms | ~1.00x | ≈ | 17.0% | 50 |
| findUnique email | 0.185ms ±0.0089 | 0.114ms ±0.0053 | 0.137ms | ~1.00x | ≈ | 16.7% | 50 |
| count | 0.132ms ±0.017 | 0.062ms ±0.0022 | 0.083ms | ~1.00x | ≈ | 12.9% | 50 |
| count where | 0.468ms ±0.0089 | 0.282ms ±0.0047 | 0.285ms | ~1.00x | ≈ | 6.1% | 50 |
| aggregate count | 0.246ms ±0.0083 | 0.160ms ±0.0042 | — | ~1.00x | ≈ | 9.5% | 50 |
| aggregate sum/avg | 0.341ms ±0.014 | 0.343ms ±0.033 | — | ~1.00x | ≈ | 34.6% | 50 |
| aggregate where | 0.472ms ±0.020 | 0.289ms ±0.0069 | — | ~1.00x | ≈ | 8.7% | 50 |
| aggregate min/max | 0.321ms ±0.0086 | 0.276ms ±0.0055 | — | ~1.00x | ≈ | 7.1% | 50 |
| aggregate complete | 0.419ms ±0.011 | 0.341ms ±0.015 | — | ~1.00x | ≈ | 15.6% | 50 |
| groupBy | 0.410ms ±0.0094 | 0.368ms ±0.0083 | — | ~1.00x | ≈ | 8.1% | 50 |
| groupBy count | 0.457ms ±0.011 | 0.413ms ±0.048 | — | ~1.00x | ≈ | 41.7% | 50 |
| groupBy multi | 0.576ms ±0.017 | 0.458ms ±0.011 | — | ~1.00x | ≈ | 8.7% | 50 |
| groupBy having | 0.502ms ±0.014 | 0.470ms ±0.023 | — | ~1.00x | ≈ | 17.4% | 50 |
| groupBy + where | 0.513ms ±0.0097 | 0.345ms ±0.040 | — | ~1.00x | ≈ | 41.6% | 50 |
| _count via include | 0.668ms ±0.019 | 0.636ms ±0.015 | — | ~1.00x | ≈ | 8.6% | 50 |
| _count via include + relations | 1.58ms ±0.040 | 1.36ms ±0.059 | — | ~1.00x | ≈ | 15.7% | 50 |
| groupBy aggregates | 0.519ms ±0.021 | 0.435ms ±0.014 | — | ~1.00x | ≈ | 11.7% | 50 |
| groupBy min/max | 0.495ms ±0.010 | 0.428ms ±0.013 | — | ~1.00x | ≈ | 10.8% | 50 |
| include list + nested to-one | 1.45ms ±0.047 | 0.542ms ±0.112 | — | ~1.00x | ≈ | 74.4% | 50 |
| include list + nullable to-one | 2.49ms ±0.044 | 1.47ms ±0.098 | — | 1.69x | *** | 24.0% | 50 |
| include posts | 2.39ms ±0.026 | 1.95ms ±0.044 | 2.43ms | ~1.00x | ≈ | 8.2% | 50 |
| include profile | 0.480ms ±0.032 | 0.276ms ±0.010 | 0.405ms | ~1.00x | ≈ | 13.3% | 50 |
| include 3 levels | 1.66ms ±0.032 | 1.20ms ±0.017 | 1.94ms | ~1.00x | ≈ | 5.1% | 50 |
| include 4 levels | 1.82ms ±0.028 | 1.09ms ±0.045 | 1.43ms | ~1.00x | ≈ | 14.8% | 50 |
| include + where | 1.34ms ±0.095 | 0.720ms ±0.058 | 1.82ms | ~1.00x | ≈ | 28.9% | 50 |
| include + select nested | 1.20ms ±0.018 | 1.50ms ±0.027 | 1.66ms | ~1.00x | ≈ | 6.5% | 50 |
| findMany startsWith | 0.192ms ±0.017 | 0.296ms ±0.177 | 0.135ms | ~1.00x | ≈ | 215.1% | 50 |
| findMany endsWith | 0.535ms ±0.013 | 0.213ms ±0.041 | 0.273ms | ~1.00x | ≈ | 69.4% | 50 |
| findMany NOT contains | 0.591ms ±0.027 | 0.228ms ±0.037 | 0.269ms | ~1.00x | ≈ | 59.3% | 50 |
| findMany LIKE | 0.200ms ±0.0083 | 0.128ms ±0.017 | 0.150ms | ~1.00x | ≈ | 47.3% | 50 |
| findMany < | 27.75ms ±0.511 | 6.75ms ±0.182 | 10.01ms | 4.11x 1.48x D | *** | 9.7% | 50 |
| findMany <= | 28.51ms ±0.683 | 7.92ms ±0.560 | 11.99ms | 3.60x 1.51x D | *** | 25.5% | 50 |
| findMany > | 18.60ms ±2.68 | 4.32ms ±0.187 | 6.21ms | 4.31x 1.44x D | *** | 15.7% | 50 |
| findMany NOT IN | 0.635ms ±0.024 | 0.433ms ±0.146 | 0.663ms | ~1.00x | ≈ | 121.7% | 50 |
| findMany isNot null | 0.634ms ±0.026 | 0.279ms ±0.016 | 0.332ms | ~1.00x | ≈ | 20.1% | 50 |
| orderBy multi-field | 2.21ms ±0.072 | 0.862ms ±0.102 | 0.668ms | 2.57x 0.78x D | *** | 42.6% | 50 |
| orderBy relation to-one | 2.03ms ±0.054 | 1.42ms ±0.030 | — | ~1.00x | ≈ | 7.6% | 50 |
| orderBy relation + scalar | 2.12ms ±0.030 | 1.45ms ±0.015 | — | ~1.00x | ≈ | 3.7% | 50 |
| orderBy nullable relation | 2.22ms ±0.082 | 1.20ms ±0.053 | — | 1.85x | *** | 15.9% | 50 |
| orderBy deep relation | 3.41ms ±0.076 | 1.95ms ±0.030 | — | 1.75x | *** | 5.6% | 50 |
| orderBy deep relation + scalar | 3.33ms ±0.195 | 2.39ms ±0.067 | — | ~1.00x | ≈ | 10.1% | 50 |
| distinct status | 8.60ms ±0.282 | 1.15ms ±0.026 | — | 7.49x | *** | 8.3% | 50 |
| distinct multi | 12.81ms ±0.175 | 2.52ms ±0.036 | — | 5.07x | *** | 5.2% | 50 |
| cursor composite tuple | 1.64ms ±0.021 | 1.27ms ±0.052 | — | ~1.00x | ≈ | 14.7% | 50 |
| cursor composite desc | 1.85ms ±0.039 | 1.36ms ±0.015 | — | ~1.00x | ≈ | 4.0% | 50 |
| cursor prefix of orderBy | 1.78ms ±0.029 | 1.29ms ±0.028 | — | ~1.00x | ≈ | 7.8% | 50 |
| select + include | 0.971ms ±0.019 | 0.782ms ±0.071 | 0.309ms | ~1.00x | ≈ | 32.8% | 50 |
| _count relation | 0.752ms ±0.014 | 0.625ms ±0.020 | — | ~1.00x | ≈ | 11.5% | 50 |
| _count multi-relation | 0.227ms ±0.030 | 0.154ms ±0.0053 | — | ~1.00x | ≈ | 12.2% | 50 |
| _count inside include | 1.22ms ±0.030 | 1.05ms ±0.040 | — | ~1.00x | ≈ | 13.8% | 50 |
| _count inside nested select | 1.77ms ±0.057 | 1.81ms ±0.137 | — | ~1.00x | ≈ | 27.2% | 50 |
| _count deep include | 1.82ms ±0.025 | 1.36ms ±0.045 | — | ~1.00x | ≈ | 11.9% | 50 |
| ILIKE special chars | 0.229ms ±0.014 | 0.157ms ±0.013 | — | ~1.00x | ≈ | 30.4% | 50 |
| LIKE case sensitive | 0.205ms ±0.0091 | 0.130ms ±0.012 | — | ~1.00x | ≈ | 34.4% | 50 |
| findMany Date range | 0.382ms ±0.040 | 0.470ms ±0.013 | 0.515ms | ~1.00x | ≈ | 9.8% | 50 |
| count Date range | 0.457ms ±0.011 | 0.374ms ±0.012 | 0.392ms | ~1.00x | ≈ | 11.4% | 50 |
| findMany Date gte | 0.331ms ±0.0091 | 0.147ms ±0.0039 | 0.182ms | ~1.00x | ≈ | 9.6% | 50 |
| depth-1 low-fan | 0.376ms ±0.016 | 0.229ms ±0.017 | — | ~1.00x | ≈ | 26.9% | 50 |
| depth-1 mid-fan | 2.46ms ±0.032 | 2.01ms ±0.065 | — | ~1.00x | ≈ | 11.8% | 50 |
| depth-1 high-fan | 2.17ms ±0.038 | 1.82ms ±0.029 | — | ~1.00x | ≈ | 5.8% | 50 |
| depth-1 wide | 1.95ms ±0.029 | 1.37ms ±0.069 | — | ~1.00x | ≈ | 18.2% | 50 |
| depth-1 unbound | 42.23ms ±0.621 | 10.82ms ±0.343 | — | 3.90x | *** | 11.4% | 50 |
| depth-2 | 3.77ms ±0.111 | 2.51ms ±0.222 | — | 1.50x | *** | 31.9% | 50 |
| depth-2 paginated Project→tasks | 1.51ms ±0.112 | 1.83ms ±0.228 | — | ~1.00x | ≈ | 44.9% | 50 |
| depth-2 high-fan | 2.09ms ±0.027 | 1.17ms ±0.079 | — | ~1.00x | ≈ | 24.3% | 50 |
| depth-2 wide | 4.31ms ±0.162 | 1.29ms ±0.067 | — | 3.35x | *** | 18.8% | 50 |
| depth-2 unbound | 63.87ms ±1.40 | 16.30ms ±0.669 | — | 3.92x | *** | 6.6% | 10 |
| depth-3 unbound | 14.47ms ±0.261 | 5.95ms ±0.370 | — | 2.43x | *** | 22.5% | 50 |
| depth-3 paginated | 1.64ms ±0.045 | 1.98ms ±0.236 | — | ~1.00x | ≈ | 43.1% | 50 |
| depth-4 unbound | 8.78ms ±0.198 | 4.46ms ±0.197 | — | 1.97x | *** | 15.9% | 50 |
| depth-4 paginated | 1.85ms ±0.072 | 1.60ms ±0.244 | — | ~1.00x | ≈ | 55.2% | 50 |
| findFirst depth-2 | 1.25ms ±0.028 | 0.991ms ±0.048 | — | ~1.00x | ≈ | 17.4% | 50 |
| findUnique depth-2 Project→tasks→comment | 1.57ms ±0.065 | 0.962ms ±0.077 | — | ~1.00x | ≈ | 28.7% | 50 |
| complex nested select | 2.90ms ±0.025 | 1.90ms ±0.112 | — | ~1.00x | ≈ | 21.3% | 50 |
| ultra deep query | 13.63ms ±0.362 | 8.43ms ±0.169 | — | 1.62x | *** | 7.3% | 50 |
| transaction: (3 operations) | 11.89ms ±0.190 | 9.51ms ±0.173 | — | 1.25x | *** | 6.6% | 50 |
| 测试 | Prisma | prisma-sql | Drizzle | 加速比 | 显著性 | CV% | n |
|---|---|---|---|---|---|---|---|
| findMany basic | 0.481ms ±0.038 | 0.077ms ±0.012 | 0.124ms | ~1.00x | ≈ | 56.7% | 50 |
| findMany where = | 0.402ms ±0.0069 | 0.059ms ±0.0072 | 0.137ms | ~1.00x | ≈ | 43.5% | 50 |
| findMany where >= | 13.83ms ±0.115 | 1.93ms ±0.245 | 2.51ms | 7.18x 1.31x D | *** | 45.8% | 50 |
| findMany where IN | 0.486ms ±0.051 | 0.068ms ±0.011 | 0.120ms | ~1.00x | ≈ | 55.2% | 50 |
| findMany where null | 0.182ms ±0.0053 | 0.025ms ±0.0014 | 0.060ms | ~1.00x | ≈ | 22.1% | 50 |
| findMany AND | 1.68ms ±0.030 | 0.337ms ±0.048 | 0.467ms | 5.00x 1.39x D | *** | 51.7% | 50 |
| findMany OR | 11.30ms ±0.173 | 1.57ms ±0.232 | 2.06ms | 7.22x 1.32x D | *** | 53.5% | 50 |
| findMany NOT | 0.504ms ±0.037 | 0.083ms ±0.023 | 0.101ms | ~1.00x | ≈ | 98.7% | 50 |
| findMany orderBy | 2.51ms ±0.040 | 1.95ms ±0.018 | 2.03ms | ~1.00x | ≈ | 3.3% | 50 |
| findMany pagination | 0.173ms ±0.015 | 0.057ms ±0.014 | 0.075ms | ~1.00x | ≈ | 85.5% | 50 |
| findMany select | 0.204ms ±0.029 | 0.069ms ±0.0083 | 0.044ms | ~1.00x | ≈ | 43.9% | 50 |
| findMany relation some | 5.11ms ±0.067 | 0.455ms ±0.0083 | — | 11.24x | *** | 6.7% | 50 |
| findMany relation every | 10.63ms ±0.088 | 6.95ms ±0.111 | — | 1.53x | *** | 5.8% | 50 |
| findMany relation none | 183.30ms ±0.578 | 3.59ms ±0.414 | — | 51.03x | *** | 18.6% | 10 |
| findMany nested relation | 1.19ms ±0.040 | 0.357ms ±0.015 | — | ~1.00x | ≈ | 15.4% | 50 |
| findMany complex | 0.947ms ±0.051 | 0.435ms ±0.0094 | 0.491ms | ~1.00x | ≈ | 7.8% | 50 |
| findFirst | 0.181ms ±0.039 | 0.029ms ±0.0019 | 0.068ms | ~1.00x | ≈ | 23.8% | 50 |
| findFirst skip | 0.198ms ±0.0061 | 0.033ms ±0.0011 | 0.082ms | ~1.00x | ≈ | 11.4% | 50 |
| findUnique id | 0.166ms ±0.031 | 0.030ms ±0.0022 | 0.064ms | ~1.00x | ≈ | 27.7% | 50 |
| findUnique email | 0.139ms ±0.0055 | 0.027ms ±0.0011 | 0.053ms | ~1.00x | ≈ | 14.7% | 50 |
| count | 0.071ms ±0.0025 | 0.018ms ±0.0036 | 0.018ms | ~1.00x | ≈ | 71.5% | 50 |
| count where | 0.293ms ±0.025 | 0.172ms ±0.0039 | 0.179ms | ~1.00x | ≈ | 7.9% | 50 |
| _count via include | 0.572ms ±0.011 | 0.386ms ±0.0064 | — | ~1.00x | ≈ | 6.0% | 50 |
| _count via include + relations | 1.16ms ±0.018 | 0.698ms ±0.033 | — | ~1.00x | ≈ | 16.9% | 50 |
| aggregate count | 0.166ms ±0.012 | 0.023ms ±0.0017 | — | ~1.00x | ≈ | 26.8% | 50 |
| aggregate sum/avg | 0.298ms ±0.0061 | 0.180ms ±0.0061 | — | ~1.00x | ≈ | 12.0% | 50 |
| aggregate where | 0.279ms ±0.0053 | 0.173ms ±0.0028 | — | ~1.00x | ≈ | 5.8% | 50 |
| aggregate min/max | 0.322ms ±0.027 | 0.179ms ±0.0030 | — | ~1.00x | ≈ | 6.2% | 50 |
| aggregate complete | 0.450ms ±0.025 | 0.257ms ±0.0050 | — | ~1.00x | ≈ | 7.2% | 50 |
| groupBy | 0.598ms ±0.011 | 0.480ms ±0.0067 | — | ~1.00x | ≈ | 5.0% | 50 |
| groupBy count | 0.639ms ±0.017 | 0.487ms ±0.0072 | — | ~1.00x | ≈ | 5.3% | 50 |
| groupBy multi | 1.28ms ±0.023 | 1.04ms ±0.0086 | — | ~1.00x | ≈ | 3.0% | 50 |
| groupBy having | 0.693ms ±0.011 | 0.527ms ±0.0075 | — | ~1.00x | ≈ | 5.1% | 50 |
| groupBy + where | 0.347ms ±0.0061 | 0.219ms ±0.0039 | — | ~1.00x | ≈ | 6.5% | 50 |
| groupBy aggregates | 0.777ms ±0.014 | 0.615ms ±0.0078 | — | ~1.00x | ≈ | 4.5% | 50 |
| groupBy min/max | 0.919ms ±0.055 | 0.635ms ±0.0083 | — | ~1.00x | ≈ | 4.7% | 50 |
| include posts | 2.32ms ±0.288 | 0.453ms ±0.065 | 1.53ms | 5.11x 3.38x D | *** | 51.4% | 50 |
| include profile | 0.367ms ±0.016 | 0.095ms ±0.016 | 0.260ms | ~1.00x | ≈ | 60.1% | 50 |
| include 3 levels | 1.23ms ±0.036 | 1.48ms ±0.069 | 0.941ms | ~1.00x | ≈ | 16.9% | 50 |
| include 4 levels | 1.35ms ±0.142 | 1.65ms ±0.065 | 0.762ms | ~1.00x | ≈ | 14.1% | 50 |
| include + where | 0.832ms ±0.022 | 0.309ms ±0.034 | 0.344ms | ~1.00x | ≈ | 39.7% | 50 |
| include + select nested | 0.868ms ±0.040 | 0.339ms ±0.034 | 1.12ms | ~1.00x | ≈ | 36.0% | 50 |
| findMany startsWith | 0.183ms ±0.0091 | 0.034ms ±0.0014 | 0.073ms | ~1.00x | ≈ | 15.5% | 50 |
| findMany endsWith | 0.549ms ±0.034 | 0.091ms ±0.0097 | 0.154ms | ~1.00x | ≈ | 38.2% | 50 |
| findMany NOT contains | 0.568ms ±0.048 | 0.074ms ±0.0094 | 0.116ms | ~1.00x | ≈ | 45.5% | 50 |
| findMany LIKE | 0.168ms ±0.0036 | 0.032ms ±0.0017 | 0.062ms | ~1.00x | ≈ | 17.6% | 50 |
| findMany < | 23.71ms ±0.228 | 3.32ms ±0.304 | 4.19ms | 7.15x 1.26x D | *** | 33.0% | 50 |
| findMany <= | 24.42ms ±0.132 | 3.90ms ±0.478 | 4.30ms | 6.26x 1.10x D | *** | 44.3% | 50 |
| findMany > | 13.12ms ±0.124 | 1.61ms ±0.250 | 2.22ms | 8.17x 1.38x D | *** | 56.1% | 50 |
| findMany NOT IN | 0.467ms ±0.016 | 0.067ms ±0.0091 | 0.130ms | ~1.00x | ≈ | 48.3% | 50 |
| findMany isNot null | 0.489ms ±0.030 | 0.051ms ±0.0025 | 0.096ms | ~1.00x | ≈ | 18.1% | 50 |
| orderBy multi-field | 0.723ms ±0.022 | 0.366ms ±0.0053 | 0.432ms | ~1.00x | ≈ | 5.3% | 50 |
| orderBy relation to-one | 0.690ms ±0.021 | 0.343ms ±0.0061 | — | ~1.00x | ≈ | 6.5% | 50 |
| orderBy relation + scalar | 0.801ms ±0.022 | 0.445ms ±0.014 | — | ~1.00x | ≈ | 11.1% | 50 |
| orderBy nullable relation | 0.665ms ±0.0091 | 0.351ms ±0.0053 | — | ~1.00x | ≈ | 5.3% | 50 |
| orderBy deep relation | 0.781ms ±0.024 | 0.416ms ±0.0083 | — | ~1.00x | ≈ | 7.2% | 50 |
| orderBy deep relation + scalar | 1.45ms ±0.106 | 0.764ms ±0.020 | — | ~1.00x | ≈ | 9.6% | 50 |
| distinct status | 11.96ms ±0.084 | 4.49ms ±0.024 | — | 2.66x | *** | 2.0% | 50 |
| distinct multi | 13.29ms ±0.233 | 5.52ms ±0.031 | — | 2.41x | *** | 2.0% | 50 |
| select + include | 0.649ms ±0.047 | 0.421ms ±0.055 | 0.167ms | ~1.00x | ≈ | 47.4% | 50 |
| _count relation | 0.738ms ±0.025 | 0.399ms ±0.031 | — | ~1.00x | ≈ | 28.0% | 50 |
| _count multi-relation | 0.156ms ±0.0047 | 0.058ms ±0.0039 | — | ~1.00x | ≈ | 24.5% | 50 |
| _count inside include | 0.936ms ±0.021 | 0.582ms ±0.036 | — | ~1.00x | ≈ | 22.4% | 50 |
| _count inside nested select | 1.68ms ±0.020 | 1.30ms ±0.032 | — | ~1.00x | ≈ | 8.9% | 50 |
| _count deep include | 1.46ms ±0.025 | 1.29ms ±0.044 | — | ~1.00x | ≈ | 12.4% | 50 |
| findMany Date range | 0.290ms ±0.012 | 0.056ms ±0.0080 | 0.267ms | ~1.00x | ≈ | 51.2% | 50 |
| findMany Date gte | 0.259ms ±0.0053 | 0.046ms ±0.0011 | 0.090ms | ~1.00x | ≈ | 9.3% | 50 |
| depth-1 low-fan Project→labels | 0.282ms ±0.025 | 0.069ms ±0.0055 | — | ~1.00x | ≈ | 29.8% | 50 |
| depth-1 mid-fan Project→tasks | 2.14ms ±0.036 | 0.420ms ±0.057 | — | 5.10x | *** | 49.3% | 50 |
| depth-1 high-fan User→assignedTasks | 1.82ms ±0.025 | 0.392ms ±0.060 | — | 4.65x | *** | 55.0% | 50 |
| depth-1 wide | 1.69ms ±0.038 | 0.387ms ±0.047 | — | 4.37x | *** | 44.1% | 50 |
| depth-1 no-limit Project→tasks | 37.22ms ±0.275 | 5.44ms ±0.322 | — | 6.84x | *** | 21.3% | 50 |
| depth-2 | 2.00ms ±0.163 | 0.558ms ±0.080 | — | 3.59x | *** | 51.8% | 50 |
| depth-2 paginated | 0.944ms ±0.017 | 0.488ms ±0.067 | — | ~1.00x | ≈ | 49.1% | 50 |
| depth-2 high-fan | 1.78ms ±0.039 | 0.467ms ±0.046 | — | 3.81x | *** | 35.6% | 50 |
| depth-2 wide+attach+activity | 2.06ms ±0.043 | 0.623ms ±0.055 | — | 3.30x | *** | 32.1% | 50 |
| depth-2 no-limit | 53.75ms ±0.591 | 11.22ms ±1.67 | — | 4.79x | *** | 24.1% | 10 |
| depth-3 | 10.81ms ±0.092 | 2.20ms ±0.233 | — | 4.92x | *** | 38.2% | 50 |
| depth-3 paginated | 1.17ms ±0.021 | 1.47ms ±0.090 | — | ~1.00x | ≈ | 22.1% | 50 |
| depth-4 | 6.65ms ±0.289 | 1.33ms ±0.128 | — | 5.00x | *** | 34.8% | 50 |
| depth-4 paginated | 1.18ms ±0.024 | 1.59ms ±0.059 | — | ~1.00x | ≈ | 13.4% | 50 |
| findFirst depth-2 | 1.01ms ±0.034 | 0.320ms ±0.0080 | — | ~1.00x | ≈ | 9.0% | 50 |
| findUnique depth-2 | 0.989ms ±0.016 | 0.306ms ±0.0047 | — | ~1.00x | ≈ | 5.5% | 50 |
| 测试 | Prisma | prisma-sql | Drizzle | 加速比 | 显著性 | CV% | n |
|---|---|---|---|---|---|---|---|
| findMany basic | 0.311ms ±0.056 | 0.256ms ±0.050 | 0.279ms | ~1.00x | ≈ | 71.0% | 50 |
| findMany where = | 0.516ms ±0.205 | 0.263ms ±0.060 | 0.343ms | ~1.00x | ≈ | 82.1% | 50 |
| findMany where >= | 10.68ms ±1.97 | 5.17ms ±0.599 | 6.89ms | 2.07x 1.33x D | *** | 41.9% | 50 |
| findMany where IN | 0.402ms ±0.068 | 0.408ms ±0.023 | 0.431ms | ~1.00x | ≈ | 20.3% | 50 |
| findMany where null | 0.167ms ±0.0072 | 0.154ms ±0.0078 | 0.186ms | ~1.00x | ≈ | 17.9% | 50 |
| findMany ILIKE | 0.181ms ±0.012 | 0.265ms ±0.024 | 0.214ms | ~1.00x | ≈ | 32.7% | 50 |
| findMany AND | 2.13ms ±0.098 | 1.11ms ±0.082 | 1.63ms | 1.91x 1.47x D | *** | 26.7% | 50 |
| findMany OR | 7.89ms ±0.331 | 4.28ms ±0.290 | 5.97ms | 1.84x 1.40x D | *** | 24.4% | 50 |
| findMany NOT | 0.383ms ±0.044 | 0.381ms ±0.024 | 0.418ms | ~1.00x | ≈ | 23.1% | 50 |
| findMany orderBy | 1.64ms ±0.053 | 0.737ms ±0.076 | 0.649ms | ~1.00x | ≈ | 37.0% | 50 |
| findMany pagination | 0.116ms ±0.0086 | 0.177ms ±0.026 | 0.163ms | ~1.00x | ≈ | 52.5% | 50 |
| findMany select | 0.118ms ±0.010 | 0.155ms ±0.018 | 0.141ms | ~1.00x | ≈ | 42.0% | 50 |
| findMany relation some | 0.635ms ±0.037 | 0.482ms ±0.026 | — | ~1.00x | ≈ | 19.1% | 50 |
| findMany relation every | 0.739ms ±0.075 | 0.517ms ±0.035 | — | ~1.00x | ≈ | 24.7% | 50 |
| findMany relation none | 13.37ms ±0.240 | 7.56ms ±0.248 | — | 1.77x | *** | 11.8% | 50 |
| findMany nested relation | 0.593ms ±0.023 | 0.515ms ±0.040 | — | ~1.00x | ≈ | 27.9% | 50 |
| findMany complex | 0.814ms ±0.036 | 0.491ms ±0.025 | 0.532ms | ~1.00x | ≈ | 18.6% | 50 |
| findFirst | 0.118ms ±0.0100 | 0.175ms ±0.021 | 0.158ms | ~1.00x | ≈ | 43.6% | 50 |
| findFirst skip | 0.168ms ±0.045 | 0.157ms ±0.017 | 0.171ms | ~1.00x | ≈ | 38.4% | 50 |
| findUnique id | 0.120ms ±0.013 | 0.125ms ±0.012 | 0.164ms | ~1.00x | ≈ | 33.8% | 50 |
| findUnique email | 0.131ms ±0.024 | 0.131ms ±0.019 | 0.144ms | ~1.00x | ≈ | 52.5% | 50 |
| count | 0.098ms ±0.012 | 0.086ms ±0.036 | 0.061ms | ~1.00x | ≈ | 152.3% | 50 |
| count where | 0.427ms ±0.022 | 0.307ms ±0.023 | 0.307ms | ~1.00x | ≈ | 26.8% | 50 |
| aggregate count | 0.239ms ±0.039 | 0.174ms ±0.016 | — | ~1.00x | ≈ | 32.3% | 50 |
| aggregate sum/avg | 0.326ms ±0.021 | 0.297ms ±0.022 | — | ~1.00x | ≈ | 27.0% | 50 |
| aggregate where | 0.447ms ±0.034 | 0.319ms ±0.022 | — | ~1.00x | ≈ | 25.1% | 50 |
| aggregate min/max | 0.304ms ±0.016 | 0.294ms ±0.022 | — | ~1.00x | ≈ | 27.2% | 50 |
| aggregate complete | 0.385ms ±0.021 | 0.351ms ±0.026 | — | ~1.00x | ≈ | 26.3% | 50 |
| groupBy | 0.388ms ±0.028 | 0.428ms ±0.036 | — | ~1.00x | ≈ | 30.3% | 50 |
| groupBy count | 0.501ms ±0.049 | 0.473ms ±0.054 | — | ~1.00x | ≈ | 41.4% | 50 |
| groupBy multi | 0.527ms ±0.031 | 0.506ms ±0.032 | — | ~1.00x | ≈ | 23.2% | 50 |
| groupBy having | 0.572ms ±0.088 | 0.517ms ±0.045 | — | ~1.00x | ≈ | 31.8% | 50 |
| groupBy + where | 0.561ms ±0.061 | 0.375ms ±0.045 | — | ~1.00x | ≈ | 43.0% | 50 |
| _count via include | 0.634ms ±0.053 | 0.658ms ±0.035 | — | ~1.00x | ≈ | 19.3% | 50 |
| _count via include + relations | 1.32ms ±0.076 | 1.46ms ±0.084 | — | ~1.00x | ≈ | 20.7% | 50 |
| groupBy aggregates | 0.484ms ±0.035 | 0.443ms ±0.019 | — | ~1.00x | ≈ | 15.1% | 50 |
| groupBy min/max | 0.454ms ±0.029 | 0.424ms ±0.015 | — | ~1.00x | ≈ | 12.9% | 50 |
| include list + nested to-one | 1.06ms ±0.099 | 0.412ms ±0.029 | — | ~1.00x | ≈ | 25.0% | 50 |
| include list + nullable to-one | 1.45ms ±0.121 | 2.03ms ±0.363 | — | ~1.00x | ≈ | 64.4% | 50 |
| include posts | 1.41ms ±0.100 | 2.16ms ±0.088 | 2.47ms | ~1.00x | ≈ | 14.8% | 50 |
| include profile | 0.248ms ±0.025 | 0.314ms ±0.041 | 0.557ms | ~1.00x | ≈ | 47.1% | 50 |
| include 3 levels | 1.26ms ±0.070 | 1.26ms ±0.036 | 1.53ms | ~1.00x | ≈ | 10.4% | 50 |
| include 4 levels | 1.47ms ±0.169 | 1.11ms ±0.041 | 1.47ms | ~1.00x | ≈ | 13.2% | 50 |
| include + where | 0.760ms ±0.050 | 0.740ms ±0.055 | 1.79ms | ~1.00x | ≈ | 26.8% | 50 |
| include + select nested | 0.669ms ±0.050 | 1.68ms ±0.084 | 1.85ms | 0.40x 1.10x D | *** | 18.1% | 50 |
| findMany startsWith | 0.123ms ±0.010 | 0.176ms ±0.037 | 0.157ms | ~1.00x | ≈ | 76.8% | 50 |
| findMany endsWith | 0.304ms ±0.045 | 0.298ms ±0.061 | 0.301ms | ~1.00x | ≈ | 73.6% | 50 |
| findMany NOT contains | 0.283ms ±0.046 | 0.258ms ±0.050 | 0.276ms | ~1.00x | ≈ | 70.7% | 50 |
| findMany LIKE | 0.114ms ±0.011 | 0.148ms ±0.056 | 0.148ms | ~1.00x | ≈ | 135.6% | 50 |
| findMany < | 12.56ms ±0.244 | 7.31ms ±0.249 | 11.08ms | 1.72x 1.52x D | *** | 12.3% | 50 |
| findMany <= | 17.11ms ±4.84 | 15.09ms ±4.95 | 10.33ms | 1.13x 0.68x D | ns | 118.3% | 50 |
| findMany > | 7.38ms ±0.197 | 4.65ms ±0.638 | 6.11ms | 1.59x 1.31x D | *** | 49.5% | 50 |
| findMany NOT IN | 0.345ms ±0.060 | 0.343ms ±0.019 | 0.384ms | ~1.00x | ≈ | 19.5% | 50 |
| findMany isNot null | 0.319ms ±0.044 | 0.257ms ±0.046 | 0.260ms | ~1.00x | ≈ | 64.9% | 50 |
| orderBy multi-field | 1.89ms ±0.020 | 0.633ms ±0.043 | 0.619ms | 2.98x 0.98x D | *** | 24.7% | 50 |
| orderBy relation to-one | 1.84ms ±0.034 | 1.52ms ±0.086 | — | ~1.00x | ≈ | 20.4% | 50 |
| orderBy relation + scalar | 2.40ms ±0.618 | 1.53ms ±0.028 | — | ~1.00x | ≈ | 6.7% | 50 |
| orderBy nullable relation | 1.83ms ±0.086 | 1.43ms ±0.093 | — | ~1.00x | ≈ | 23.4% | 50 |
| orderBy deep relation | 2.18ms ±0.052 | 1.69ms ±0.033 | — | ~1.00x | ≈ | 7.1% | 50 |
| orderBy deep relation + scalar | 2.68ms ±0.070 | 2.15ms ±0.037 | — | ~1.00x | ≈ | 6.2% | 50 |
| distinct status | 8.78ms ±0.188 | 1.30ms ±0.077 | — | 6.75x | *** | 21.2% | 50 |
| distinct multi | 12.68ms ±0.261 | 2.66ms ±0.051 | — | 4.77x | *** | 6.9% | 50 |
| cursor composite tuple | 1.49ms ±0.032 | 1.35ms ±0.053 | — | ~1.00x | ≈ | 14.3% | 50 |
| cursor composite desc | 1.63ms ±0.028 | 1.35ms ±0.012 | — | ~1.00x | ≈ | 3.2% | 50 |
| cursor prefix of orderBy | 1.53ms ±0.023 | 1.24ms ±0.015 | — | ~1.00x | ≈ | 4.3% | 50 |
| select + include | 0.603ms ±0.042 | 0.681ms ±0.063 | 0.378ms | ~1.00x | ≈ | 33.7% | 50 |
| _count relation | 0.572ms ±0.018 | 0.609ms ±0.019 | — | ~1.00x | ≈ | 11.3% | 50 |
| _count multi-relation | 0.193ms ±0.015 | 0.155ms ±0.0089 | — | ~1.00x | ≈ | 20.9% | 50 |
| _count inside include | 0.906ms ±0.043 | 0.988ms ±0.044 | — | ~1.00x | ≈ | 16.0% | 50 |
| _count inside nested select | 1.37ms ±0.031 | 1.52ms ±0.037 | — | ~1.00x | ≈ | 8.7% | 50 |
| _count deep include | 1.62ms ±0.080 | 1.27ms ±0.025 | — | ~1.00x | ≈ | 7.2% | 50 |
| ILIKE special chars | 0.121ms ±0.012 | 0.168ms ±0.043 | — | ~1.00x | ≈ | 92.8% | 50 |
| LIKE case sensitive | 0.104ms ±0.0091 | 0.114ms ±0.0100 | — | ~1.00x | ≈ | 31.8% | 50 |
| findMany Date range | 0.172ms ±0.030 | 0.173ms ±0.013 | 0.216ms | ~1.00x | ≈ | 26.7% | 50 |
| count Date range | 0.378ms ±0.020 | 0.364ms ±0.0083 | 0.408ms | ~1.00x | ≈ | 8.3% | 50 |
| findMany Date gte | 0.171ms ±0.014 | 0.219ms ±0.034 | 0.212ms | ~1.00x | ≈ | 55.6% | 50 |
| depth-1 low-fan | 0.254ms ±0.031 | 0.230ms ±0.0053 | — | ~1.00x | ≈ | 8.1% | 50 |
| depth-1 mid-fan | 2.48ms ±0.437 | 1.97ms ±0.106 | — | ~1.00x | ≈ | 19.3% | 50 |
| depth-1 high-fan | 1.27ms ±0.150 | 2.25ms ±0.121 | — | ~1.00x | ≈ | 19.4% | 50 |
| depth-1 wide | 1.03ms ±0.092 | 1.58ms ±0.098 | — | ~1.00x | ≈ | 22.4% | 50 |
| depth-1 unbound | 20.57ms ±0.824 | 11.58ms ±1.15 | — | 1.78x | *** | 35.8% | 50 |
| depth-2 | 2.72ms ±0.109 | 2.97ms ±0.153 | — | ~1.00x | ≈ | 18.6% | 50 |
| depth-2 paginated Project→tasks | 0.983ms ±0.091 | 1.98ms ±0.254 | — | ~1.00x | ≈ | 46.5% | 50 |
| depth-2 high-fan | 1.25ms ±0.098 | 1.19ms ±0.068 | — | ~1.00x | ≈ | 20.7% | 50 |
| depth-2 wide | 1.43ms ±0.122 | 1.35ms ±0.078 | — | ~1.00x | ≈ | 21.0% | 50 |
| depth-2 unbound | 33.42ms ±0.818 | 19.13ms ±0.384 | — | 1.75x | *** | 7.2% | 50 |
| depth-3 unbound | 8.95ms ±0.357 | 8.12ms ±0.236 | — | ~1.00x | ≈ | 10.5% | 50 |
| depth-3 paginated | 1.15ms ±0.066 | 1.59ms ±0.216 | — | ~1.00x | ≈ | 49.1% | 50 |
| depth-4 unbound | 4.59ms ±0.292 | 3.07ms ±0.149 | — | 1.50x | *** | 17.6% | 50 |
| depth-4 paginated | 1.40ms ±0.110 | 1.66ms ±0.204 | — | ~1.00x | ≈ | 44.5% | 50 |
| findFirst depth-2 | 0.853ms ±0.068 | 1.04ms ±0.058 | — | ~1.00x | ≈ | 20.2% | 50 |
| findUnique depth-2 Project→tasks→comment | 0.869ms ±0.057 | 0.965ms ±0.045 | — | ~1.00x | ≈ | 17.0% | 50 |
| complex nested select | 3.21ms ±0.099 | 2.14ms ±0.048 | — | 1.50x | *** | 8.1% | 50 |
| ultra deep query | 6.89ms ±0.203 | 6.82ms ±0.097 | — | ~1.00x | ≈ | 5.1% | 50 |
| transaction: (3 operations) | 2.44ms ±0.065 | 1.10ms ±0.027 | — | 2.21x | *** | 8.7% | 50 |
| 测试 | Prisma | prisma-sql | Drizzle | 加速比 | 显著性 | CV% | n |
|---|---|---|---|---|---|---|---|
| findMany basic | 0.200ms ±0.045 | 0.080ms ±0.014 | 0.152ms | ~1.00x | ≈ | 60.6% | 50 |
| findMany where = | 0.139ms ±0.0050 | 0.067ms ±0.0067 | 0.140ms | ~1.00x | ≈ | 36.4% | 50 |
| findMany where >= | 4.73ms ±0.194 | 2.14ms ±0.344 | 2.56ms | 2.21x 1.19x D | *** | 57.9% | 50 |
| findMany where IN | 0.197ms ±0.042 | 0.067ms ±0.0078 | 0.156ms | ~1.00x | ≈ | 41.9% | 50 |
| findMany where null | 0.070ms ±0.0033 | 0.025ms ±0.0006 | 0.061ms | ~1.00x | ≈ | 8.0% | 50 |
| findMany AND | 0.717ms ±0.102 | 0.364ms ±0.060 | 0.512ms | ~1.00x | ≈ | 59.1% | 50 |
| findMany OR | 3.92ms ±0.201 | 1.74ms ±0.243 | 2.19ms | 2.26x 1.26x D | *** | 50.6% | 50 |
| findMany NOT | 0.160ms ±0.013 | 0.135ms ±0.102 | 0.147ms | ~1.00x | ≈ | 271.5% | 50 |
| findMany orderBy | 1.99ms ±0.033 | 2.02ms ±0.070 | 1.94ms | ~1.00x | ≈ | 12.5% | 50 |
| findMany pagination | 0.079ms ±0.0083 | 0.040ms ±0.0033 | 0.070ms | ~1.00x | ≈ | 29.8% | 50 |
| findMany select | 0.067ms ±0.0044 | 0.073ms ±0.0055 | 0.042ms | ~1.00x | ≈ | 27.8% | 50 |
| findMany relation some | 0.422ms ±0.011 | 0.489ms ±0.048 | — | ~1.00x | ≈ | 35.3% | 50 |
| findMany relation every | 10.17ms ±0.058 | 6.95ms ±0.094 | — | 1.46x | *** | 4.9% | 50 |
| findMany relation none | 138.52ms ±1.80 | 4.34ms ±0.764 | — | 31.93x | *** | 28.4% | 10 |
| findMany nested relation | 0.436ms ±0.045 | 0.365ms ±0.019 | — | ~1.00x | ≈ | 19.0% | 50 |
| findMany complex | 0.577ms ±0.027 | 0.534ms ±0.018 | 0.568ms | ~1.00x | ≈ | 12.2% | 50 |
| findFirst | 0.108ms ±0.022 | 0.034ms ±0.0036 | 0.082ms | ~1.00x | ≈ | 38.0% | 50 |
| findFirst skip | 0.150ms ±0.075 | 0.073ms ±0.017 | 0.137ms | ~1.00x | ≈ | 82.3% | 50 |
| findUnique id | 0.113ms ±0.017 | 0.045ms ±0.0100 | 0.082ms | ~1.00x | ≈ | 79.3% | 50 |
| findUnique email | 0.099ms ±0.014 | 0.038ms ±0.0033 | 0.090ms | ~1.00x | ≈ | 33.0% | 50 |
| count | 0.042ms ±0.0033 | 0.017ms ±0.0028 | 0.017ms | ~1.00x | ≈ | 59.8% | 50 |
| count where | 0.214ms ±0.0055 | 0.176ms ±0.0036 | 0.183ms | ~1.00x | ≈ | 7.4% | 50 |
| _count via include | 0.466ms ±0.0094 | 0.384ms ±0.0075 | — | ~1.00x | ≈ | 6.9% | 50 |
| _count via include + relations | 0.882ms ±0.049 | 0.752ms ±0.032 | — | ~1.00x | ≈ | 15.5% | 50 |
| aggregate count | 0.079ms ±0.0019 | 0.025ms ±0.0008 | — | ~1.00x | ≈ | 10.3% | 50 |
| aggregate sum/avg | 0.237ms ±0.013 | 0.197ms ±0.014 | — | ~1.00x | ≈ | 25.4% | 50 |
| aggregate where | 0.214ms ±0.0069 | 0.183ms ±0.0028 | — | ~1.00x | ≈ | 5.7% | 50 |
| aggregate min/max | 0.228ms ±0.0067 | 0.185ms ±0.0036 | — | ~1.00x | ≈ | 7.0% | 50 |
| aggregate complete | 0.302ms ±0.0053 | 0.252ms ±0.0039 | — | ~1.00x | ≈ | 5.7% | 50 |
| groupBy | 2.20ms ±1.09 | 0.528ms ±0.045 | — | 4.16x | ** | 30.6% | 50 |
| groupBy count | 0.542ms ±0.014 | 0.717ms ±0.090 | — | ~1.00x | ≈ | 45.5% | 50 |
| groupBy multi | 1.06ms ±0.011 | 1.05ms ±0.015 | — | ~1.00x | ≈ | 5.1% | 50 |
| groupBy having | 0.553ms ±0.014 | 0.526ms ±0.024 | — | ~1.00x | ≈ | 16.5% | 50 |
| groupBy + where | 0.245ms ±0.0080 | 0.242ms ±0.052 | — | ~1.00x | ≈ | 77.8% | 50 |
| groupBy aggregates | 0.651ms ±0.013 | 0.606ms ±0.0075 | — | ~1.00x | ≈ | 4.5% | 50 |
| groupBy min/max | 0.659ms ±0.014 | 0.671ms ±0.034 | — | ~1.00x | ≈ | 18.4% | 50 |
| include posts | 0.953ms ±0.108 | 0.488ms ±0.072 | 1.49ms | ~1.00x | ≈ | 52.8% | 50 |
| include profile | 0.199ms ±0.028 | 0.100ms ±0.015 | 0.265ms | ~1.00x | ≈ | 54.5% | 50 |
| include 3 levels | 0.711ms ±0.059 | 1.56ms ±0.086 | 0.871ms | ~1.00x | ≈ | 19.8% | 50 |
| include 4 levels | 0.776ms ±0.063 | 1.89ms ±0.147 | 0.699ms | 0.41x 0.37x D | *** | 28.1% | 50 |
| include + where | 0.512ms ±0.055 | 0.336ms ±0.043 | 0.339ms | ~1.00x | ≈ | 46.0% | 50 |
| include + select nested | 0.405ms ±0.042 | 0.354ms ±0.028 | 1.08ms | ~1.00x | ≈ | 28.1% | 50 |
| findMany startsWith | 0.086ms ±0.012 | 0.037ms ±0.0008 | 0.069ms | ~1.00x | ≈ | 9.3% | 50 |
| findMany endsWith | 0.162ms ±0.0067 | 0.076ms ±0.0083 | 0.155ms | ~1.00x | ≈ | 39.5% | 50 |
| findMany NOT contains | 0.162ms ±0.0050 | 0.091ms ±0.045 | 0.141ms | ~1.00x | ≈ | 180.4% | 50 |
| findMany LIKE | 0.071ms ±0.0047 | 0.035ms ±0.0008 | 0.089ms | ~1.00x | ≈ | 8.7% | 50 |
| findMany < | 7.74ms ±0.275 | 3.56ms ±0.288 | 4.33ms | 2.18x 1.22x D | *** | 29.2% | 50 |
| findMany <= | 8.46ms ±0.379 | 3.29ms ±0.198 | 4.62ms | 2.57x 1.40x D | *** | 21.8% | 50 |
| findMany > | 4.24ms ±0.147 | 1.57ms ±0.151 | 2.41ms | 2.69x 1.53x D | *** | 34.5% | 50 |
| findMany NOT IN | 0.214ms ±0.058 | 0.059ms ±0.0022 | 0.144ms | ~1.00x | ≈ | 13.9% | 50 |
| findMany isNot null | 0.182ms ±0.060 | 0.057ms ±0.0022 | 0.103ms | ~1.00x | ≈ | 14.2% | 50 |
| orderBy multi-field | 0.462ms ±0.0080 | 0.417ms ±0.053 | 0.450ms | ~1.00x | ≈ | 46.3% | 50 |
| orderBy relation to-one | 0.433ms ±0.013 | 0.359ms ±0.012 | — | ~1.00x | ≈ | 11.8% | 50 |
| orderBy relation + scalar | 0.539ms ±0.058 | 0.435ms ±0.0075 | — | ~1.00x | ≈ | 6.2% | 50 |
| orderBy nullable relation | 0.486ms ±0.067 | 0.388ms ±0.025 | — | ~1.00x | ≈ | 23.3% | 50 |
| orderBy deep relation | 0.495ms ±0.0086 | 0.410ms ±0.0061 | — | ~1.00x | ≈ | 5.5% | 50 |
| orderBy deep relation + scalar | 0.839ms ±0.015 | 0.803ms ±0.057 | — | ~1.00x | ≈ | 25.7% | 50 |
| distinct status | 7.73ms ±0.280 | 5.40ms ±0.199 | — | 1.43x | *** | 13.3% | 50 |
| distinct multi | 7.52ms ±0.138 | 5.83ms ±0.037 | — | 1.29x | *** | 2.3% | 50 |
| select + include | 0.329ms ±0.015 | 0.309ms ±0.042 | 0.191ms | ~1.00x | ≈ | 48.7% | 50 |
| _count relation | 0.485ms ±0.045 | 0.385ms ±0.0072 | — | ~1.00x | ≈ | 6.7% | 50 |
| _count multi-relation | 0.093ms ±0.0055 | 0.055ms ±0.0055 | — | ~1.00x | ≈ | 36.2% | 50 |
| _count inside include | 0.711ms ±0.053 | 0.863ms ±0.058 | — | ~1.00x | ≈ | 24.1% | 50 |
| _count inside nested select | 1.38ms ±0.040 | 1.25ms ±0.014 | — | ~1.00x | ≈ | 4.0% | 50 |
| _count deep include | 1.11ms ±0.042 | 1.37ms ±0.078 | — | ~1.00x | ≈ | 20.6% | 50 |
| findMany Date range | 0.124ms ±0.021 | 0.058ms ±0.0083 | 0.365ms | ~1.00x | ≈ | 50.6% | 50 |
| findMany Date gte | 0.100ms ±0.0069 | 0.052ms ±0.0022 | 0.143ms | ~1.00x | ≈ | 16.1% | 50 |
| depth-1 low-fan Project→labels | 0.144ms ±0.0078 | 0.106ms ±0.061 | — | ~1.00x | ≈ | 208.2% | 50 |
| depth-1 mid-fan Project→tasks | 0.883ms ±0.090 | 0.448ms ±0.080 | — | ~1.00x | ≈ | 64.2% | 50 |
| depth-1 high-fan User→assignedTasks | 0.793ms ±0.093 | 0.426ms ±0.074 | — | ~1.00x | ≈ | 62.9% | 50 |
| depth-1 wide | 0.776ms ±0.086 | 0.391ms ±0.046 | — | ~1.00x | ≈ | 42.4% | 50 |
| depth-1 no-limit Project→tasks | 12.80ms ±0.353 | 5.63ms ±0.234 | — | 2.27x | *** | 15.0% | 50 |
| depth-2 | 0.981ms ±0.109 | 0.642ms ±0.092 | — | ~1.00x | ≈ | 51.6% | 50 |
| depth-2 paginated | 0.686ms ±0.069 | 0.626ms ±0.085 | — | ~1.00x | ≈ | 49.2% | 50 |
| depth-2 high-fan | 0.921ms ±0.120 | 0.533ms ±0.053 | — | ~1.00x | ≈ | 35.9% | 50 |
| depth-2 wide+attach+activity | 1.27ms ±0.123 | 0.838ms ±0.127 | — | ~1.00x | ≈ | 54.8% | 50 |
| depth-2 no-limit | 20.25ms ±0.530 | 10.39ms ±0.478 | — | 1.95x | *** | 16.6% | 50 |
| depth-3 | 4.61ms ±0.262 | 2.40ms ±0.397 | — | 1.92x | *** | 59.5% | 50 |
| depth-3 paginated | 0.713ms ±0.057 | 1.48ms ±0.077 | — | ~1.00x | ≈ | 18.9% | 50 |
| depth-4 | 2.51ms ±0.160 | 1.23ms ±0.094 | — | 2.05x | *** | 27.6% | 50 |
| depth-4 paginated | 0.745ms ±0.054 | 1.74ms ±0.095 | — | ~1.00x | ≈ | 19.6% | 50 |
| findFirst depth-2 | 0.617ms ±0.082 | 0.367ms ±0.050 | — | ~1.00x | ≈ | 48.6% | 50 |
| findUnique depth-2 | 0.582ms ±0.049 | 0.335ms ±0.049 | — | ~1.00x | ≈ | 52.4% | 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 来优化这些读取,通常能降低聚合型端点延迟。