대량의 데이터를 한 번에 전부 보여주는 것은 비효율적입니다. 이럴 때 페이지네이션(Pagination)을 활용하면, 데이터를 일정 단위로 나누어 효율적으로 출력할 수 있습니다.
MySQL에서는 LIMIT와 OFFSET을 조합하여 간단하게 구현할 수 있습니다.
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이 큰 경우, 데이터베이스가 불필요한 스캔을 하므로 응답 속도가 느려질 수 있습니다.
'개발 > DB' 카테고리의 다른 글
MySQL에서 EXPLAIN 명령어로 쿼리 성능 분석 (1) | 2025.08.18 |
---|---|
MySQL 트랜잭션 격리 수준(ISOLATION LEVEL) 이해하기 (2) | 2025.08.16 |
MySQL에서 JSON 데이터 처리하기 (저장·조회·수정·인덱싱) (3) | 2025.08.15 |
MySQL의 Full-Text Search 기능 사용법 (1) | 2025.08.14 |
MySQL 쿼리 최적화 도구 활용법 (2) | 2025.08.13 |