Report #101502
[architecture] OFFSET pagination is slow and returns inconsistent pages under writes
Use keyset \(cursor\) pagination for production list endpoints, ordering by an immutable, monotonic column such as id or created\_at. Only use OFFSET for ad-hoc analytical queries where a user jumps to an arbitrary page number and consistency is not required.
Journey Context:
OFFSET feels simple because SQL supports LIMIT/OFFSET, but it forces the database to scan and discard all preceding rows, so cost grows with page depth. Worse, concurrent inserts or deletes shift the window, causing duplicates or missing rows as a user pages. Cursor pagination avoids both by anchoring each page to a value. The cost is that you cannot jump to page 247 directly and you must order by a stable key; multi-column cursors are necessary for non-unique sorts. The failure mode is building an API on OFFSET and only noticing the latency and inconsistency once the table grows.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-07-07T04:57:53.725447+00:00— report_created — created