Optimizing Prisma Performance

1. Reducing N+1 Queries

// Bad — N+1
for (const u of users) await prisma.post.findMany({ where: { authorId: u.id } });
// Good — single query
await prisma.user.findMany({ include: { posts: true } });
StrategyDetail
include / selectEager load relations
in()Batch IDs in one query
DataLoaderBatch + cache per request

2. Using Select to Limit Fields

BenefitDetail
Smaller payloadLess network
Index-only scansIf select fits covering index

3. Implementing Query Caching

LayerDetail
AccelerateTTL/SWR cache via Prisma
App cacheRedis/in-memory
HTTP cacheCache GET endpoints

4. Using Connection Pooling

OptionDetail
connection_limitTune per worker
PgBouncerExternal pool (use ?pgbouncer=true)
AccelerateManaged pooler

5. Implementing Pagination Properly

MethodUse
CursorScales to millions
KeysetStable order, indexed
Skip/takeSmall offsets only

6. Optimizing Includes

TipDetail
Nested selectTrim fields inside includes
Avoid deep nestingMultiple shallow queries can be faster
take inside includeLimit child rows

7. Using Batching

const [users, posts] = await prisma.$transaction([
  prisma.user.findMany(),
  prisma.post.findMany()
]);
AspectDetail
Array txSingle round-trip
DataLoaderPer-request batching

8. Implementing Index Optimization

ActionDetail
Cover filter+orderComposite index
Partial indexesFilter common predicate
Drop unusedReduce write cost

9. Using Read Replicas

AspectDetail
Extension@prisma/extension-read-replicas
RoutingReads → replicas, writes → primary
LagAccept eventual consistency

10. Monitoring Performance Metrics

SourceDetail
prisma.$metrics.json()Counters/histograms
Prometheusprisma.$metrics.prometheus()
OTELSpans + metrics export