Skip to content

Latest commit

 

History

History
33 lines (24 loc) · 1.04 KB

File metadata and controls

33 lines (24 loc) · 1.04 KB

Offset 기반 페이지네이션의 성능 문제

Q. 아이템이 총 100만 건이 있는 상황에서 offset 방식의 쿼리로 50만 번째 아이템이 있는 페이지를 조회한다고 했을 때 성능이 어떨까요?

핵심 답변

  • DB는 지정된 offset 값까지의 모든 행을 스캔하게 됨
  • 따라서 offset 값이 커질수록 쿼리 시간이 선형적으로 증가

쿼리 시간이 느려지는 원인

SELECT * FROM news
ORDER BY id
OFFSET 1000
LIMIT 10;
  • 위 쿼리 실행 시 DB는 1,010개 행을 읽은 뒤 앞의 1,000개 행을 버리고 남은 10개 행만 반환
  • 결국 페이지가 많아질수록 앞의 페이지까지 전부 조회하고 있는 셈

해결 방법 - Keyset/Cursor 기반 페이지네이션

SELECT * FROM news
WHERE id > 123
ORDER BY id
LIMIT 10;
  • 특정 항목 이후부터 조회하는 방식
  • 다만 올바른 인덱스 및 ORDER BY 조건 필요
  • 페이지별 초기 id 값을 정확히 예측할 수 있다면 offset 없이도 조회가 가능해짐