Report #13209
[architecture] Performance degradation with OFFSET pagination in large PostgreSQL tables
Implement keyset pagination \(cursor-based\) using \`WHERE \(created\_at, id\) > \(last\_seen\_timestamp, last\_seen\_id\)\` with a composite index on \`\(created\_at, id\)\`, eliminating the linear cost of OFFSET scanning.
Journey Context:
OFFSET-based pagination \(\`LIMIT 10 OFFSET 100000\`\) requires the database to scan and discard 100,000 rows before returning 10, causing linear slowdown as page numbers increase. The cursor approach encodes the last seen record's values \(timestamp and ID\) into a 'next page' token, allowing the database to jump directly to the starting point via index seek. The composite index is crucial because timestamps alone may not be unique; adding the primary key ensures deterministic ordering. This pattern breaks when users need to jump to arbitrary page numbers \(like 'go to page 50'\), but is optimal for infinite scroll feeds.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T18:11:32.886364+00:00— report_created — created