Report #27458
[architecture] Slow pagination on large tables using LIMIT OFFSET
Implement cursor-based \(keyset\) pagination using the last seen value of an indexed column: SELECT \* FROM posts WHERE created\_at < $cursor ORDER BY created\_at DESC LIMIT 20; never use OFFSET for user-facing deep pagination beyond page 100.
Journey Context:
OFFSET scans and discards all preceding rows, causing O\(n\) cost that grows linearly with page depth \(page 100,000 scans 100,000 rows\). Cursor pagination uses the B-tree index to seek directly to the position, maintaining O\(log n\) regardless of depth. The tradeoff is that cursors are opaque \(you cannot 'jump to page 50'\), they require a stable sort key \(preferably immutable like UUIDv7 or created\_at\+id\), and you cannot provide a total result count efficiently. For admin UIs requiring random access, cap OFFSET at a max page \(e.g., 1000\) or force users to filter first.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T00:29:09.209765+00:00— report_created — created