피드로 돌아가기
Pagination: Always a "sort" (of) mistake [bugfix]
Dev.toDev.to
Database

Non-unique Sort Key로 인한 Pagination 데이터 중복 및 누락 해결

Pagination: Always a "sort" (of) mistake [bugfix]

Fabio Bazurto Blacio2026년 6월 22일3intermediate

Context

Rails Kaminari Gem의 LIMIT/OFFSET 전략을 사용한 Pagination 구현 구조. created_at과 같이 값이 중복 가능한 컬럼을 단일 정렬 기준으로 설정하여 데이터 정렬 순서의 비결정성(Non-determinism) 발생.

Technical Solution

  • Non-unique Key 정렬 시 MySQL 엔진이 임의로 레코드 순서를 결정하는 특성 파악
  • 페이지 요청 간 실행 시점마다 정렬 순서가 변하며 동일 레코드가 중복 노출되거나 누락되는 현상 식별
  • Deterministic Sort 보장을 위해 Unique Value인 Primary Key(id)를 보조 정렬 기준으로 추가
  • order(created_at: :desc, id: :desc) 설계를 통한 레코드별 절대적 위치 고정
  • 데이터베이스 인덱스를 고려한 정렬 컬럼 선택으로 쿼리 성능 저하 방지

- Pagination 구현 시 정렬 기준 컬럼의 Unique 여부 확인 - 중복 가능 컬럼 사용 시 반드시 Primary Key 등 Unique Column을 Secondary Sort Key로 지정 - LIMIT/OFFSET 기반 페이지네이션의 결정적 정렬(Deterministic Sorting) 보장 여부 검토

원문 읽기