Bird
Raised Fist0
GraphQLquery~10 mins

Persisted queries in GraphQL - Step-by-Step Execution

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Concept Flow - Persisted queries
Client prepares query
Check if query is persisted?
YesSend query ID only
Server looks up query
Send full query to server
Execute stored query
Server stores query
Return result
Execute query
Client receives data
Client sends queries; if query is new, server stores it and executes; later client sends only query ID for faster execution.
Execution Sample
GraphQL
mutation PersistQuery {
  persistQuery(query: "{ user { id name } }") {
    id
  }
}

query GetUser {
  user {
    id
    name
  }
}
First, client sends a mutation to store the query and get an ID; later client sends query ID to fetch user data.
Execution Table
StepActionInputServer BehaviorOutput
1Client sends persistQuery mutation{ user { id name } }Stores query, generates ID 'abc123'{ id: "abc123" }
2Client sends query with ID 'abc123'ID: 'abc123'Looks up stored query by IDExecutes query and returns user data
3Server returns user dataN/AN/A{ user: { id: "1", name: "Alice" } }
4Client receives dataN/AN/AUser data displayed
💡 Execution stops after client receives the requested data.
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3Final
querynull{ user { id name } }ID 'abc123'Stored query fetchedExecuted query result
queryIDnull'abc123''abc123''abc123''abc123'
responsenull{ id: "abc123" }User dataUser dataUser data
Key Moments - 2 Insights
Why does the client send only the query ID after the first time?
Because the server has stored the full query linked to that ID (see execution_table step 2), so sending only the ID saves bandwidth and speeds up the request.
What happens if the client sends a query ID that the server does not recognize?
The server cannot find the stored query and will return an error or ask the client to send the full query again (not shown in this trace but important to know).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what does the server return after storing the query in step 1?
AError message
B{ id: 'abc123' }
CUser data
DEmpty response
💡 Hint
Check the Output column in step 1 of execution_table.
At which step does the server execute the stored query?
AStep 3
BStep 1
CStep 2
DStep 4
💡 Hint
Look at the Server Behavior and Output columns in steps 2 and 3.
If the client sends a new query instead of an ID, what would happen according to the flow?
AServer executes the new query and stores it
BServer rejects the query
CServer returns cached data
DClient receives an error
💡 Hint
Refer to the concept_flow where new queries are stored and executed.
Concept Snapshot
Persisted queries let clients send a query once to store it on the server.
Later, clients send only the query ID to run the stored query.
This reduces data sent and speeds up requests.
If the server doesn't recognize the ID, it asks for the full query again.
Common in GraphQL to optimize network usage.
Full Transcript
Persisted queries are a way to optimize GraphQL requests. First, the client sends the full query to the server using a special mutation to store it. The server saves the query and returns a unique ID. Later, the client sends only this ID to request data. The server looks up the stored query by ID, executes it, and returns the result. This saves bandwidth and speeds up communication. If the client sends an unknown ID, the server will ask for the full query again. This process helps reduce repeated sending of large queries over the network.

Practice

(1/5)
1. What is the main benefit of using persisted queries in GraphQL?
easy
A. The server stores user credentials for faster login.
B. Clients send only a unique ID instead of the full query, saving bandwidth.
C. Queries are automatically optimized by the client.
D. It allows clients to write queries without validation.

Solution

  1. Step 1: Understand what persisted queries do

    Persisted queries store the full GraphQL query on the server with a unique ID.
  2. Step 2: Identify the client-server interaction

    Clients send only the ID to run the query, reducing the data sent over the network.
  3. Final Answer:

    Clients send only a unique ID instead of the full query, saving bandwidth. -> Option B
  4. Quick Check:

    Persisted queries reduce data sent = Clients send only a unique ID instead of the full query, saving bandwidth. [OK]
Hint: Persisted queries send IDs, not full queries [OK]
Common Mistakes:
  • Thinking clients send full queries every time
  • Confusing persisted queries with client-side caching
  • Believing persisted queries store user data
2. Which of the following is the correct way to send a persisted query request in GraphQL?
easy
A. { "id": "12345", "variables": { "userId": "1" } }
B. { "query": "{ user(id: 1) { name } }" }
C. { "mutation": "updateUser" }
D. { "headers": { "Authorization": "token" } }

Solution

  1. Step 1: Identify the persisted query request format

    Persisted queries send the unique query ID and variables, not the full query string.
  2. Step 2: Match the correct JSON structure

    { "id": "12345", "variables": { "userId": "1" } } sends an ID and variables, which is the correct persisted query format.
  3. Final Answer:

    { "id": "12345", "variables": { "userId": "1" } } -> Option A
  4. Quick Check:

    Persisted query request = ID + variables [OK]
Hint: Persisted queries use ID field, not full query [OK]
Common Mistakes:
  • Sending full query instead of ID
  • Using mutation key instead of id
  • Confusing headers with query payload
3. Given the following persisted query setup, what will the server return when the client sends { "id": "abc123", "variables": { "limit": 5 } } if the query with ID abc123 fetches the first limit users?

Assume the database has 10 users named User1 to User10.

Options:
medium
A. []
B. [{"name": "User6"}, {"name": "User7"}, {"name": "User8"}, {"name": "User9"}, {"name": "User10"}]
C. [{"name": "User1"}, {"name": "User2"}, {"name": "User3"}, {"name": "User4"}, {"name": "User5"}]
D. Error: Query ID not found

Solution

  1. Step 1: Understand the query and variables

    The query with ID 'abc123' fetches users limited by the 'limit' variable, which is 5 here.
  2. Step 2: Determine the expected result

    Since the database has users User1 to User10, fetching the first 5 returns User1 to User5.
  3. Final Answer:

    [{"name": "User1"}, {"name": "User2"}, {"name": "User3"}, {"name": "User4"}, {"name": "User5"}] -> Option C
  4. Quick Check:

    Limit 5 users returns first 5 users [OK]
Hint: Variables control query output; check their values [OK]
Common Mistakes:
  • Assuming query returns last users
  • Thinking ID is invalid
  • Ignoring variables in query
4. A developer tries to use persisted queries but gets an error: Query ID not found. What is the most likely cause?
medium
A. The client sent a query ID that the server does not recognize.
B. The client sent the full query instead of the ID.
C. The server does not support GraphQL.
D. The client forgot to include variables.

Solution

  1. Step 1: Analyze the error message

    The error 'Query ID not found' means the server cannot find the query matching the sent ID.
  2. Step 2: Identify the cause

    This usually happens if the client sends an ID that was never registered or stored on the server.
  3. Final Answer:

    The client sent a query ID that the server does not recognize. -> Option A
  4. Quick Check:

    Unknown query ID causes 'Query ID not found' error [OK]
Hint: Check if query ID is registered on server [OK]
Common Mistakes:
  • Assuming full query sent causes this error
  • Blaming missing variables for this error
  • Thinking server lacks GraphQL support
5. You want to secure your GraphQL API by allowing only persisted queries. Which approach best achieves this?
hard
A. Disable persisted queries and use API keys instead.
B. Allow all queries but log those without IDs for review.
C. Require clients to send full queries and IDs together.
D. Reject any request that does not include a valid persisted query ID.

Solution

  1. Step 1: Understand API security with persisted queries

    Allowing only persisted queries means the server accepts requests only if they have a valid stored query ID.
  2. Step 2: Identify the best enforcement method

    Rejecting requests without valid IDs ensures only approved queries run, improving security.
  3. Final Answer:

    Reject any request that does not include a valid persisted query ID. -> Option D
  4. Quick Check:

    Only accept valid persisted query IDs to secure API [OK]
Hint: Block requests missing valid persisted query IDs [OK]
Common Mistakes:
  • Allowing all queries weakens security
  • Sending full queries defeats persisted query purpose
  • Relying only on API keys without query control