Skip to content

Commit 894ba29

Browse files
committed
proofreading and spelling fixes
1 parent 3f48fba commit 894ba29

File tree

1 file changed

+16
-13
lines changed

1 file changed

+16
-13
lines changed

website/pages/docs/n1-dataloader.mdx

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
title: Solving the N+1 Problem with `DataLoader`
33
---
44

5-
When building a server with GraphQL.js, it's common to
6-
run into performance issues caused by the N+1 problem: a pattern that
7-
leads to a large number of unnecessary database or service calls,
5+
When building a server with GraphQL.js, it's common to encounter
6+
performance issues related to the N+1 problem: a pattern that
7+
results in many unnecessary database or service calls,
88
especially in nested query structures.
99

1010
This guide explains what the N+1 problem is, why it's relevant in
@@ -15,7 +15,7 @@ GraphQL field resolution, and how to address it using
1515

1616
The N+1 problem happens when your API fetches a list of items using one
1717
query, and then issues an additional query for each item in the list.
18-
In GraphQL, this ususally occurs in nested field resolvers.
18+
In GraphQL, this usually occurs in nested field resolvers.
1919

2020
For example, in the following query:
2121

@@ -34,8 +34,8 @@ For example, in the following query:
3434
If the `posts` field returns 10 items, and each `author` field fetches
3535
the author by ID with a separate database call, the server performs
3636
11 total queries: one to fetch the posts, and one for each post's author
37-
(10 total authors). This doesn't scale well as the number of parent items
38-
increases.
37+
(10 total authors). As the number of parent items increases, the number
38+
of database calls grows, which can degrade performance.
3939

4040
Even if several posts share the same author, the server will still issue
4141
duplicate queries unless you implement deduplication or batching manually.
@@ -52,14 +52,16 @@ could be grouped.
5252
## Solving the problem with `DataLoader`
5353

5454
[`DataLoader`](https://github.com/graphql/dataloader) is a utility library designed
55-
to solver this problem. It batches multiple `.load(key)` calls into a single `batchLoadFn(keys)`
55+
to solve this problem. It batches multiple `.load(key)` calls into a single `batchLoadFn(keys)`
5656
call and caches results during the life of a request. This means you can reduce redundant data
5757
fetches and group related lookups into efficient operations.
5858

59-
To use `DataLoader` in a `graphpql-js` server:
59+
To use `DataLoader` in a `graphql-js` server:
6060

6161
1. Create `DataLoader` instances for each request.
62-
2. Attach the instance to the `contextValue` passed to GraphQL execution.
62+
2. Attach the instance to the `contextValue` passed to GraphQL execution. You can attach the
63+
loader when calling [`graphql()`](https://graphql.org/graphql-js/graphql/#graphql) directly, or
64+
when setting up a GraphQL HTTP server such as [express-graphql](https://github.com/graphql/express-graphql).
6365
3. Use `.load(id)` in resolvers to fetch data through the loader.
6466

6567
### Example: Batching author lookups
@@ -125,7 +127,7 @@ function createContext() {
125127

126128
With this setup, all `.load(authorId)` calls are automatically collected and batched
127129
into a single call to `getUsersByIds`. `DataLoader` also caches results for the duration
128-
of the request, so repeated `.loads(id)` calls for the same ID don't trigger
130+
of the request, so repeated `.load(id)` calls for the same ID don't trigger
129131
additional fetches.
130132

131133
## Best practices
@@ -136,10 +138,11 @@ correctly and avoids leaking data between users.
136138
`DataLoader` contract. If a key is not found, return `null` or throw depending on
137139
your policy.
138140
- Keep batch functions focused. Each loader should handle a specific data access pattern.
139-
- Use `.loadMany()` sparingly. While it's useful in some cases, you usually don't need it
140-
in field resolvers. `.load()` is typically enough, and batching happens automatically.
141+
- Use `.loadMany()` sparingly. While it's useful when you already have a list of IDs, it's
142+
typically not needed in field resolvers, since `.load()` already batches individual calls
143+
made within the same execution cycle.
141144

142145
## Additional resources
143146

144147
- [`DataLoader` GitHub repository](https://github.com/graphql/dataloader): Includes full API docs and usage examples
145-
- [GraphQL field resovlers](https://graphql.org/graphql-js/resolvers/): Background on how field resolution works.
148+
- [GraphQL field resolvers](https://graphql.org/graphql-js/resolvers/): Background on how field resolution works.

0 commit comments

Comments
 (0)