페이징 쿼리

전체 데이터를 일정 단위로 나누어 조회하는 쿼리로, 한 번에 처리하는 데이터 양을 줄여 데이터베이스와 애플리케이션의 리소스 사용을 절감하고 응답 시간을 단축시킵니다.


OFFSET 기반 페이징

가장 널리 쓰이는 방식은 LIMIT, OFFSET을 사용하는 것입니다.

select *
from subscribe
limit 500
offset 0;

OFFSET으로 건너뛸 행 수를, LIMIT으로 가져올 행 수를 지정합니다.


OFFSET 방식의 단점

DBMS는 지정된 OFFSET 수만큼 레코드를 모두 읽은 뒤에야 원하는 데이터를 가져옵니다. 그래서 뒤 페이지로 갈수록 읽어야 하는 레코드 수가 늘어나 응답 시간이 점점 길어집니다.


No Offset 페이징 (커서 기반)

OFFSET을 사용하지 않고, 이전 페이지의 마지막 데이터 값을 기준으로 다음 페이지를 조회하는 방식입니다. 매번 앞의 레코드를 건너뛰며 읽을 필요가 없어 뒤 페이지에서도 조회 성능이 일정하게 유지됩니다. 이 방식을 효율적으로 쓰려면 정렬·검색에 사용하는 컬럼으로 복합 인덱스를 구성해야 합니다.

예를 들어 다음과 같은 테이블이 있다고 가정합니다.

create table subscribe (
   id int not null auto_increment,
   deleted_at datetime null,
   created_at datetime not null,
   primary key(id),
   key idx_deleted_at_id(deleted_at, id)
);

특정 기간 동안 구독을 해제한 사용자를 deleted_at, id 순으로 정렬해 조회한다고 하면, 첫 페이지는 다음과 같이 조회합니다.

select *
from subscribe
where
    deleted_at >= ? and deleted_at < ?
order by deleted_at, id
limit 10;

이후 페이지는 이전에 조회된 페이지의 마지막 값을 기준으로 조회합니다. 이전 페이지 마지막 값의 deleted_at이 2024-01-01 00:00:00이고 id가 78이라면 다음 쿼리를 사용합니다.

select *
from subscribe
where
   -- deleted_at이 같은 케이스를 대응
   (deleted_at = '2024-01-01 00:00:00' and id > 78) or
   -- 마지막 데이터 이후 데이터 조회
   (deleted_at > '2024-01-01 00:00:00' and deleted_at < ?)
order by deleted_at, id
limit 10;

OFFSET 방식 vs No Offset 방식

구분OFFSET 방식No Offset 방식
구현 난이도쉬움비교적 어려움 (이전 값 필요)
뒤 페이지 조회 성능페이지가 뒤로 갈수록 느려짐일정하게 유지됨
특정 페이지로 바로 이동가능 (예: 50페이지)불가능 (순차 이동만 가능)
대표 사용처관리자 페이지, 페이지 번호 UI무한 스크롤, 대용량 배치 처리

핵심 정리

→ RDB에서 페이징 쿼리의 필요성을 설명해 주세요

CSLOG에서 보기