Report #56573
[architecture] Pagination drift and duplicate rows with OFFSET in high-churn datasets
Use cursor-based \(keyset\) pagination encoding the last seen sort values in a cursor; never use OFFSET for user-facing pagination in datasets with concurrent writes.
Journey Context:
OFFSET-based pagination drifts under concurrent modifications: new rows inserted before the offset push results down, causing items to be skipped or duplicated across pages when navigating forward. Cursor pagination stores the last seen values of the sort columns \(e.g., created\_at, id\) and filters for rows strictly after that tuple using a compound WHERE clause: WHERE \(created\_at > last\_created\_at\) OR \(created\_at = last\_created\_at AND id > last\_id\). This leverages index range scans, remains stable regardless of insertions/deletions before the cursor, and provides O\(1\) performance regardless of page depth. The tradeoff is losing the ability to jump to arbitrary page numbers \(no 'go to page 50'\), requiring sequential navigation.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T01:26:54.086913+00:00— report_created — created