상세 컨텐츠

본문 제목

Offset vs Cursor Pagination 처리 방식

DBMS/SQL

by code_down 2024. 5. 21. 09:29

본문

오프셋 기반 페이지네이션 (Offset Based Pagination)

일반적인 Pagination 에서 사용되는게 Offset Pagination 이다.

 

SELECT * FROM `table` ORDER BY id DESC LIMIT 20, 10

 

LIMIT 절의 건너 뛸 개수(offset), 뒤의 숫자가 가져올 데이터 개수 입니다.

 

장점

  • 총 recode 수 와 page 위치를 알 수 있다.
    이는 사용자가 원하는 페이지를 선택하고 바로 그 페이지의 데이터를 볼 수 있다는 것을 의미한다.

단점

  • 데이터가 불일치
    사용자가 1 페이지부터 +1 씩 증가 하면서 다음 페이지의 데이터를 보는 중에 게시물이 삭제되거나 추가 되었을 때, 사용자는 다음 페이지에서 동일한 게시물을 보거나 확인하지 못하고 넘어가는 게시물이 생긴다.
  • RDBMS 에서 offset 쿼리 퍼포먼스 이슈
    offset 값을 지정하여 조회 한다고 했을 때, offset 값 만큼 row 를 확인하기 때문에 offset 값이 올라갈 수록 쿼리의 퍼포먼스는 떨어지게 된다.

 

2. 커서 기반 페이지네이션 (Cursor Based Pagination)

Cursor Pagination 은 무한 스크롤 이나 더보기 버튼을 이용해 다음 데이터를 불러올 때 주로 사용되는 방식이다.

현재 보고있는 데이터의 마지막 번호인 Cursor 와 불러올 데이터 개수인  page_size 를 이용해 서버에 데이터를 요청한다.

 

첫번째 페이지 정보 조회

SELECT * FROM `table` ORDER BY id DESC LIMIT 5

 

첫번째 페이지 결과

id (PK) value
100 ...
99 ...
98 ...
97 ...
96 ...

 

두번째 페이지 정보 조회

SELECT * FROM `table` WHERE id < 96 ORDER BY id DESC LIMIT 5

 

이때, cursor가 테이블의 id 입니다.

 

장점

  • 데이터 변경에 안정적
    데이터의 추가, 삭제시 중복된 데이터를 노출하거나 데이터를 확인하지 못하는 상황이 발생하지 않는다.
  • 대규모 데이터에 조회에 적합하다.
    cursor 의 데이터가 인덱싱 되어 있을때, cursor를 바로 찾아 원하는 개수만큼의 데이터를 불러 올 수 있다.

단점

  • 사용자가 원하는 페이지로 이동할 수 없다.
  • 정렬 기능이 제한된다.

 

Offset VS Cursor

 

'DBMS > SQL' 카테고리의 다른 글

[Redis] 레디스 기본 문법 가이드  (0) 2025.02.27