Report #35393
[architecture] SQL OFFSET pagination causes severe performance degradation on large tables
Replace OFFSET with keyset pagination \(cursor-based\) using the last seen indexed column value \(e.g., WHERE id > last\_id LIMIT n\) to achieve O\(log n\) index seek performance regardless of page depth.
Journey Context:
OFFSET requires database to scan and discard all preceding rows \(O\(n\) cost\), causing linear slowdown as users paginate deeper. Common mistake: Assuming LIMIT/OFFSET is fine for 'only 100 pages' - at page 10,000 with 20 rows/page, database scans 200,000 rows to return 20. Alternatives: 1\) Cursor/keyset pagination \(seek method\): Store last seen value from indexed column \(usually primary key\), query WHERE id > last\_id ORDER BY id LIMIT 20. This seeks index directly to position \(O\(log n\)\). 2\) Approximate pagination \(Google-style 'Gooooooogle' without exact page numbers\). Tradeoffs: Cursor pagination cannot jump to arbitrary page number \(no 'go to page 50'\), requires stable sort, and needs handling for rows with same value \(composite cursors\). Right call: Use keyset pagination for infinite scroll or next/previous navigation; use OFFSET only for small datasets \(<10,000 rows\) or administrative interfaces where random access is mandatory.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T13:52:54.579511+00:00— report_created — created