Querying GSI in DynamoDB - Time & Space Complexity
When we ask how fast a DynamoDB query runs on a Global Secondary Index (GSI), we want to know how the work grows as the data grows.
We are trying to see how the number of items in the GSI affects the time it takes to get results.
Analyze the time complexity of the following code snippet.
const params = {
TableName: "Orders",
IndexName: "CustomerIndex",
KeyConditionExpression: "CustomerId = :cid",
ExpressionAttributeValues: {
":cid": { S: "12345" }
}
};
const result = await dynamodb.query(params).promise();
This code queries the GSI named "CustomerIndex" to find all orders for a specific customer ID.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Scanning through matching items in the GSI for the given customer ID.
- How many times: Once for each matching item found in the GSI.
As the number of orders for a customer grows, the query takes longer because it reads more matching items.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | Reads about 10 items |
| 100 | Reads about 100 items |
| 1000 | Reads about 1000 items |
Pattern observation: The time grows roughly in direct proportion to the number of matching items.
Time Complexity: O(n)
This means the time to get results grows linearly with the number of matching items in the GSI.
[X] Wrong: "Querying a GSI always takes constant time regardless of data size."
[OK] Correct: The query time depends on how many items match the key condition, so more matches mean more work.
Understanding how query time grows with data size shows you know how databases handle indexes and why efficient queries matter.
"What if we added a filter expression after the query? How would that affect the time complexity?"
Practice
Solution
Step 1: Understand what a GSI is used for
A GSI allows querying data using a different key than the primary key.Step 2: Identify the main benefit of querying a GSI
Querying a GSI helps find items quickly without scanning the entire table.Final Answer:
To find items using an alternate key without scanning the whole table -> Option DQuick Check:
Query GSI = alternate key search [OK]
- Confusing GSI query with table scan
- Thinking GSI is for deleting or updating keys
- Assuming GSI creates backups
Solution
Step 1: Recall the correct parameter name for GSI in DynamoDB query
The correct parameter to specify a GSI is 'IndexName'.Step 2: Check the options for correct syntax
Only query({ TableName: 'MyTable', IndexName: 'MyGSI', KeyConditionExpression: 'GSIKey = :val', ExpressionAttributeValues: { ':val': '123' } }) uses 'IndexName' correctly with other required fields.Final Answer:
query({ TableName: 'MyTable', IndexName: 'MyGSI', KeyConditionExpression: 'GSIKey = :val', ExpressionAttributeValues: { ':val': '123' } }) -> Option CQuick Check:
Use IndexName to specify GSI [OK]
- Using 'KeyName' or 'GSIName' instead of 'IndexName'
- Omitting ExpressionAttributeValues
- Wrong key condition syntax
query({ TableName: 'Orders', IndexName: 'StatusIndex', KeyConditionExpression: 'status = :s', ExpressionAttributeValues: { ':s': 'shipped' } })Solution
Step 1: Understand the query parameters
The query uses 'StatusIndex' GSI with a key condition on 'status' = 'shipped'.Step 2: Determine what the query returns
It returns all items where 'status' attribute equals 'shipped' using the GSI, which is designed for this attribute.Final Answer:
All orders with status 'shipped' using the GSI -> Option AQuick Check:
Query GSI by status = shipped returns matching items [OK]
- Thinking GSI query returns all items
- Assuming GSI query causes error if attribute not primary key
- Believing GSI queries are unsupported
query({ TableName: 'Products', IndexName: 'CategoryIndex', KeyConditionExpression: 'category = :c', ExpressionAttributeValues: { ':c': 'books' } })What is the most likely cause of the error?
Solution
Step 1: Understand GSI key requirements
When querying a GSI, the KeyConditionExpression must use the GSI's partition key attribute.Step 2: Identify the error cause
If 'category' is not the partition key of 'CategoryIndex', the query will fail with an error.Final Answer:
The attribute 'category' is not the partition key of the GSI 'CategoryIndex' -> Option BQuick Check:
GSI query key must be GSI partition key [OK]
- Using a non-key attribute in KeyConditionExpression
- Assuming table name typo causes this error
- Believing GSI queries are unsupported
Solution
Step 1: Use the GSI name and correct key condition
Query must specify 'IndexName' as 'DeptIndex' and use KeyConditionExpression with partition key and sort key conditions.Step 2: Check logical operators and expressions
KeyConditionExpression supports 'AND' for partition key and sort key conditions; 'OR' is invalid here.Step 3: Verify FilterExpression usage
FilterExpression filters after query; it cannot replace KeyConditionExpression for keys.Final Answer:
query({ TableName: 'Employees', IndexName: 'DeptIndex', KeyConditionExpression: 'department = :d AND hireDate > :h', ExpressionAttributeValues: { ':d': 'Sales', ':h': '2023-01-01' } }) -> Option AQuick Check:
Use KeyConditionExpression with AND on GSI keys [OK]
- Using OR instead of AND in KeyConditionExpression
- Omitting IndexName for GSI query
- Using FilterExpression instead of KeyConditionExpression for keys
Ready to prove it?
Pass the test and this pattern moves unknown
