api performance ai_generated true

GraphQL query takes 30s+ with nested resolvers due to N+1 database queries

ID: api/graphql-n-plus-one-dataloader

Also available as: JSON · Markdown
90%Fix Rate
92%Confidence
3Evidence
2023-01-01First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
any active

Root Cause

GraphQL resolvers execute per-field per-item. A query returning 100 users with posts generates 101 SQL queries. DataLoader batching fixes this but must be per-request scoped.

generic

Workarounds

  1. 95% success Create DataLoader instances per-request in context
    context = { userLoader: new DataLoader(ids => User.findByIds(ids)) }  // new per request
  2. 85% success Use query complexity analysis to reject expensive queries
    depthLimit(10), createComplexityLimitRule(1000)

Dead Ends

Common approaches that don't work:

  1. Add database indexes to speed up individual resolver queries 80% fail

    Indexes help per-query speed but don't reduce the 100+ query count. The bottleneck is round-trip overhead.

  2. Create a single global DataLoader instance 88% fail

    DataLoader cache must be per-request. A global instance leaks data between users and grows unbounded.