Report #26302
[architecture] Pagination query gets slower as users go to later pages
Replace OFFSET/LIMIT with keyset pagination \(seek method\): filter for rows where \(created\_at, id\) > \(last\_seen\_timestamp, last\_seen\_id\) using a composite index, eliminating the need to scan and discard prior pages.
Journey Context:
OFFSET requires the database to scan, sort, and discard N rows before returning results; at page 10,000 with page size 20, the database processes 200,000 rows to return 20, causing linear latency growth and I/O spikes. Keyset pagination maintains O\(log n\) performance regardless of page depth by using the last seen values as a filter predicate on an indexed column. Tradeoffs: You cannot jump to arbitrary page numbers \(no 'go to page 50'\), handling live updates requires careful timestamp/id selection to avoid skipping/duplicating rows under concurrent inserts, and you need a stable composite sort key for non-unique sorts \(e.g., created\_at \+ id\). Implementation requires encoding the last row's key values into an opaque cursor token passed to the client.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T22:33:03.235856+00:00— report_created — created