Estimated read/write ratio: 8:1 (query-heavy on email lookup at hatch)
Read utilisation — healthy
💡 Recommendation: email is high-cardinality (unique per user) — low hot partition risk. Consider sparse projection (KEYS_ONLY or INCLUDE specific attrs) if storage cost is a concern. No structural change needed at current scale.
Estimated read/write ratio: 4:1 (moderate write load from connection updates)
Moderate utilisation — monitor growth
⚠ Hot partition risk: If a small number of owner_ids hold many connections, those partitions will receive disproportionate WCU traffic. Monitor per-partition WCU in CloudWatch. Mitigation: add a sort key suffix (shard key pattern) or use write sharding if connection fan-out grows. Consider sparse GSI if most items don't need owner_index.
fields @timestamp, @message
| filter @message like /owner_index/
| stats count() as writes by bin(5m)
| sort @timestamp desc
| limit 200
Estimated read/write ratio: 2:1 (write-heavy — every peck/auth event writes)
Write-heavy index — optimise projection
💡 Recommendation: Use KEYS_ONLY or INCLUDE only queried attributes to reduce GSI replication write cost. audit_log grows fastest of all tables — each write replicates to this GSI. Add TTL on created_at to expire old records and reduce index size over time.
fields @timestamp, @message, duck_id
| filter @message like /ConditionalCheckFailed/ or @message like /ProvisionedThroughputExceeded/
| stats count() by duck_id, bin(5m)
| sort count desc
| limit 50
cert_id_index
birth_certificates tableHot partition risk: Low
Partition key: cert_id (UUID — very high cardinality) · Projection: ALL · Billing: PAY_PER_REQUEST
Estimated read/write ratio: 12:1 (read-heavy — certs read on every verification)
Read-dominant — healthy for PAY_PER_REQUEST
✓ Healthy pattern: UUID partition key ensures uniform distribution. High read:write ratio is expected for cert verification. Consider DAX (DynamoDB Accelerator) if verification requests spike at hatch bursts.
fields @timestamp, requestId
| filter @message like /cert_id_index/
| stats count() as lookups by bin(1h)
| sort @timestamp desc
| limit 100