DynamoDB doesn’t have a traditional SQL-style LIMIT
clause. Instead, it offers the ability to limit the number of items returned in a query or scan using the Limit
parameter. This is extremely useful for pagination, performance, and cost control.
In this guide, we’ll walk through how to use Limit
effectively in DynamoDB with Python and Boto3.
Table of Contents
-
Understanding LIMIT in DynamoDB
-
Prerequisites
-
Using Limit in a
scan()
Operation -
Using Limit in a
query()
Operation -
Pagination with LastEvaluatedKey
-
Complete Example with Pagination
-
Tips and Best Practices
-
Common Pitfalls
-
Conclusion
1. Understanding LIMIT in DynamoDB
-
Limit
controls the maximum number of items returned by aquery()
orscan()
request. -
It does not guarantee total number of results unless you check for
LastEvaluatedKey
. -
Can be used for pagination, preview results, or testing performance.
Important: DynamoDB internally pages results in 1MB chunks. If a
Limit
is higher than what fits in 1MB, the request may still be paged.
⚙️ 2. Prerequisites
Make sure you have:
-
A DynamoDB table (e.g.,
Users
) -
Python and
boto3
installed:
pip install boto3
-
AWS credentials configured via
aws configure
Sample table: Users
Primary Key: user_id
(partition key)
3. Using Limit in a scan()
Operation
The scan()
method reads every item in the table but can be limited using the Limit
parameter.
import boto3
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Users')
response = table.scan(Limit=5)
items = response['Items']
print("First 5 items:")
for item in items:
print(item)
⚠️ Use
scan()
with caution for large tables — it’s expensive and slow.
4. Using Limit in a query()
Operation
The query()
method retrieves items that match a partition key, and can also be limited.
response = table.query(
KeyConditionExpression=boto3.dynamodb.conditions.Key('user_id').eq('001'),
Limit=3
)
items = response['Items']
print("First 3 items for user_id=001:")
for item in items:
print(item)
5. Pagination with LastEvaluatedKey
DynamoDB won’t return more than your Limit
, or beyond 1MB of data. To fetch the next "page", you must use the LastEvaluatedKey
.
Example:
response = table.scan(Limit=5)
items = response['Items']
last_key = response.get('LastEvaluatedKey')
while last_key:
response = table.scan(Limit=5, ExclusiveStartKey=last_key)
items.extend(response['Items'])
last_key = response.get('LastEvaluatedKey')
6. Complete Example with Pagination Function
import boto3
def scan_with_limit(table_name, limit):
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table(table_name)
response = table.scan(Limit=limit)
items = response['Items']
last_key = response.get('LastEvaluatedKey')
print(f"Fetched {len(items)} items:")
for item in items:
print(item)
if last_key:
print("\nMore items available. Use `ExclusiveStartKey` to continue.\n")
else:
print("\nEnd of data reached.")
# Run it
scan_with_limit('Users', 5)
7. Tips and Best Practices
Tip | Reason |
---|---|
✅ Use Limit to reduce read costs |
Reads fewer items |
✅ Combine with LastEvaluatedKey for pagination |
Handles large result sets |
✅ Prefer query() over scan() |
More efficient |
❌ Don't assume Limit=5 always returns 5 items |
May return fewer |
❌ Don't forget to check LastEvaluatedKey |
You might miss remaining data |
⚠️ 8. Common Pitfalls
Pitfall | Fix |
---|---|
❌ Using scan() on large datasets |
Use query() or filter+partition |
❌ Ignoring LastEvaluatedKey |
Results may be incomplete |
❌ Confusing Limit with filtering |
Use FilterExpression separately |
❌ Expecting sorted results | DynamoDB does not sort unless sort key is queried |
❌ Using Limit as security control |
It only limits returned results, not access |
✅ 9. Conclusion
The Limit
parameter in DynamoDB is essential when you need to:
-
Page through large datasets
-
Avoid high read costs
-
Fetch previews of data
When paired with LastEvaluatedKey
, Limit
lets you efficiently and safely paginate through tables, especially in applications like admin dashboards, APIs, or reports.