Report #14562
[architecture] Deep pagination performance degradation with LIMIT/OFFSET in large SQL tables
Implement keyset pagination \(cursor-based\) using the last seen values of indexed columns \(e.g., WHERE \(created\_at, id\) > \(?, ?\) ORDER BY created\_at, id\). Encode the cursor as an opaque string \(Base64 or encrypted\) to prevent API consumers from crafting arbitrary queries.
Journey Context:
OFFSET requires the database to scan and discard N rows before returning results, making it O\(n\) cost that degrades linearly with page depth \(page 100,000 of 20 rows each = 2M rows scanned\). Keyset pagination is O\(log n\) using index seeks. Critical implementation details: \(1\) Must include a unique column in the ORDER BY \(tie-breaker\) to avoid skipping rows when the sort column has duplicates; \(2\) Cannot jump to arbitrary page numbers \(no 'go to page 5'\), only next/previous; \(3\) Direction changes \(reverse sort\) require flipping the comparison operator. Tradeoff: stateless offset is simpler for small tables \(<100k rows\) or admin UIs needing random access.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T21:50:43.067677+00:00— report_created — created