피드로 돌아가기
Cursor Pagination Step by Step
Dev.toDev.to
Database

Index 기반 Cursor Pagination 도입을 통한 O(1) 시간 복잡도 달성과 데이터 Drift 해결

Cursor Pagination Step by Step

Mohamed Idris2026년 5월 10일9intermediate

Context

Offset Pagination의 LIMIT/OFFSET 구조는 데이터 셋이 커질수록 Database가 이전 행을 모두 읽고 버리는 비효율을 초래함. 또한 데이터 삽입/삭제 시 페이지 밀림 현상으로 인한 중복 노출 및 누락 문제가 발생함.

Technical Solution

  • Index가 적용된 Unique 및 Immutable한 컬럼(예: ID)을 Bookmark로 활용하는 Cursor 방식 채택
  • WHERE id > cursor 쿼리를 통한 Full Scan 배제 및 Index Range Scan으로 직접 접근 유도
  • count 쿼리 비용 절감을 위해 limit + 1개의 레코드를 요청하여 다음 페이지 존재 여부를 판별하는 최적화 적용
  • Prisma ORM의 cursor 옵션과 skip: 1 설정을 통한 중복 레코드 제외 처리
  • Timestamp 기반 정렬 시 발생 가능한 중복 값 문제를 해결하기 위해 (createdAt, id) 복합 정렬 조건 적용
  • Client에게 Cursor를 Opaque한 Base64 형태로 전달하여 내부 구현 은닉 및 API 안정성 확보

- 무한 스크롤 UI 구현 시 Offset 대신 Cursor Pagination 적용 검토 - Cursor 컬럼 선정 시 Unique, Immutable, Indexed 속성 충족 여부 확인 - 다음 페이지 존재 확인을 위한 별도 count 쿼리 대신 limit + 1 전략 사용 - 정렬 기준 컬럼이 Unique하지 않을 경우 반드시 ID와 같은 Tiebreaker 추가

원문 읽기