Report #11231
[architecture] OFFSET pagination is slow and causes missing/duplicate items during writes
Use keyset pagination \(cursor-based\): encode the last seen value of the ordered column\(s\) as an opaque cursor. Query uses WHERE \(sort\_col, id\) > \(last\_val, last\_id\) with a composite index on \(sort\_col, id\). Never expose raw database IDs if security requires obscurity; use encrypted cursors \(e.g., cursor = base64\(aes\_encrypt\(last\_val,last\_id\)\)\).
Journey Context:
OFFSET requires the database to scan and discard N rows, making it O\(n\) and slow for deep pages. It also suffers from 'drift': if new rows are inserted during pagination, subsequent pages shift, causing items to be skipped or duplicated. Keyset pagination is O\(log n\) using indexes and is stable against inserts \(new items appear only at the end if sorted by created\_at DESC, or are simply not seen if not yet created\). Tradeoff: cannot jump to arbitrary page numbers \(no 'go to page 50'\), only next/previous. Requires a unique sort key \(composite with ID if sort column isn't unique\). For complex sorts \(multiple columns\), encode all columns in the cursor.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T12:49:16.594439+00:00— report_created — created