MySQL에서 LIMIT와 OFFSET을 사용한 페이지네이션

대량의 데이터를 한 번에 전부 보여주는 것은 비효율적입니다. 이럴 때 페이지네이션(Pagination)을 활용하면, 데이터를 일정 단위로 나누어 효율적으로 출력할 수 있습니다.

MySQL에서는 LIMITOFFSET을 조합하여 간단하게 구현할 수 있습니다.

 

 

1) LIMIT와 OFFSET의 기본 개념

  • LIMIT: 가져올 데이터의 개수를 제한합니다.
  • OFFSET: 데이터 조회를 시작할 위치를 지정합니다.

예를 들어, LIMIT 10 OFFSET 20은 21번째 데이터부터 10개의 데이터를 가져옵니다.

 

 

2) 기본 사용 예시

-- 첫 번째 페이지 (1~10번 데이터)
SELECT * FROM products
ORDER BY product_id
LIMIT 10 OFFSET 0;

-- 두 번째 페이지 (11~20번 데이터)
SELECT * FROM products
ORDER BY product_id
LIMIT 10 OFFSET 10;

-- 세 번째 페이지 (21~30번 데이터)
SELECT * FROM products
ORDER BY product_id
LIMIT 10 OFFSET 20;

Tip: OFFSET은 OFFSET n 대신 LIMIT start, count 형식으로도 쓸 수 있습니다. 예: LIMIT 20, 10

 

3) 페이지 번호 기반 쿼리

페이지네이션을 구현할 때, 페이지 번호와 페이지 크기를 변수로 두면 재사용이 용이합니다.

SET @page = 3;       -- 페이지 번호
SET @page_size = 10; -- 페이지당 데이터 수

SELECT * FROM products
ORDER BY product_id
LIMIT @page_size OFFSET (@page - 1) * @page_size;

 

4) LIMIT와 OFFSET의 성능 고려사항

  • OFFSET 값이 커질수록 쿼리 속도가 느려질 수 있습니다.
  • 특히 수만 건 이상 되는 테이블에서는 OFFSET 대신 커서 기반 페이지네이션 또는 WHERE 조건 기반 페이지네이션이 효율적입니다.

예시 (커서 기반):

-- 마지막으로 본 product_id 이후 데이터 가져오기
SELECT * FROM products
WHERE product_id > @last_id
ORDER BY product_id
LIMIT 10;

 

5) LIMIT와 OFFSET 사용 시 주의점

  • 항상 ORDER BY를 함께 사용해야 예측 가능한 결과를 얻을 수 있습니다.
  • OFFSET이 큰 경우, 데이터베이스가 불필요한 스캔을 하므로 응답 속도가 느려질 수 있습니다.