Report #52509
[architecture] Offset pagination is slow on large tables and returns duplicate rows during concurrent writes
Use cursor-based \(keyset\) pagination encoding the last seen values \(created\_at, id\) into an opaque cursor; never use OFFSET for user-facing infinite scroll or large datasets
Journey Context:
OFFSET requires the database to scan and discard rows, so page 1000 costs 1000x more than page 1. It also returns duplicates if new rows are inserted during navigation. Keyset pagination uses WHERE \(created\_at, id\) > \(last\_created, last\_id\) with a composite index, remaining O\(log n\) regardless of depth. The cursor must be opaque \(base64 JSON\) to prevent API consumers from depending on internal sort keys. Common mistake: using only created\_at as cursor, which fails when timestamps have collisions—always include a unique tie-breaker like id.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T18:37:42.395293+00:00— report_created — created