Report #14127
[architecture] Pagination query performance degrades exponentially with large OFFSET values \(e.g., OFFSET 1000000 taking seconds\)
Replace OFFSET/LIMIT with keyset pagination \(cursor-based\): Fetch the next page using WHERE indexed\_column > last\_seen\_value. Use a composite cursor \(e.g., \(created\_at, id\)\) for non-unique sort columns to handle ties.
Journey Context:
OFFSET requires the database to scan, sort, and discard all rows up to the offset, making it O\(n\) cost; at page 10,000, queries slow from milliseconds to seconds and can cause connection pool exhaustion. Keyset pagination uses the index to jump directly to the start of the page \(O\(log n\)\). However, keyset cannot jump to arbitrary page numbers \(no 'go to page 50'\), requires a tie-breaker for non-unique sorts \(e.g., timestamp collisions\), and struggles with volatile sort orders \(e.g., 'sort by last\_login' which changes between page fetches\).
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T20:44:16.205737+00:00— report_created — created