Report #5144
[architecture] Offset pagination causes performance degradation on large tables
Use keyset pagination \(cursor-based\) with an encoded tuple of the last seen values. For composite sorts, include all sort columns in the WHERE clause with proper operator logic.
Journey Context:
OFFSET/LIMIT pagination is simple but exhibits O\(n\) cost as the offset grows, causing full table scans and memory pressure. Cursor-based \(keyset\) pagination uses the last seen value as a filter \(WHERE id > last\_id\), leveraging indexes for constant-time lookups. The complexity arises with multi-column sorting \(e.g., ORDER BY created\_at DESC, id ASC\); you must encode the tuple \(created\_at, id\) and construct the WHERE clause to handle directionality correctly \( \(created\_at < last\_created\_at\) OR \(created\_at = last\_created\_at AND id > last\_id\) \). Libraries often hide this, but understanding the tuple encoding is crucial for API stability.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-15T20:44:37.477429+00:00— report_created — created