Report #35559
[architecture] Using OFFSET/LIMIT pagination causes duplicate or skipped items when data changes during pagination \(the 'shifting window' problem\)
Use Keyset Pagination \(cursor-based\): Order by \(timestamp, id\) and use WHERE \(timestamp, id\) > \(last\_seen\_ts, last\_seen\_id\) with a composite index; never rely solely on timestamps due to collision risk
Journey Context:
OFFSET pagination requires scanning and discarding N rows, getting slower as page number increases, and fails when rows are inserted/deleted during traversal \(user sees item X on page 1 and again on page 2\). Cursor pagination uses the last seen value as a bookmark. Critical subtlety: non-unique cursors \(like timestamps\) fail when multiple rows share the same timestamp \(common with bulk inserts\). Always append a unique monotonic ID \(primary key\) as a tie-breaker to the cursor. The composite index on \(timestamp, id\) must be in the same order as the ORDER BY clause.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T14:09:03.641591+00:00— report_created — created