DB

[MySQL] SELECT LIMIT / OFFSET (행의 개수 제한 / 페이징 처리)

인생아 2025. 6. 24. 16:53
반응형

MySQL에서 데이터를 조회할 때, 모든 데이터를 한꺼번에 가져오는 것은 비효율적일 수 있다.
특히 페이지 단위로 데이터를 나눠서 보여줘야 하는 웹 페이지나 앱 화면에서는
LIMIT과 OFFSET을 활용한 페이징 처리가 꼭 필요하다.

📌 LIMIT이란 무엇인가?

LIMIT은 MySQL에서 가져올 행(row)의 개수를 제한하는 SQL 문법이다.

SELECT * FROM 테이블명
LIMIT 개수;

예제:

SELECT * FROM users
LIMIT 5;
  • users 테이블에서 상위 5개 행만 조회

이 기능은 속도 개선UX 최적화에 매우 효과적이며,
리스트, 테이블, 게시판 등 거의 모든 화면에서 필수로 사용된다.

반응형

📍 OFFSET이란 무엇인가?

OFFSET은 건너뛸 행의 수를 지정한다.
예를 들어, 10개씩 끊어서 2번째 페이지를 보고 싶다면
앞의 10개는 건너뛰고 그 다음 10개를 가져와야 한다.

SELECT * FROM users
LIMIT 10 OFFSET 10;
  • 11번째부터 10개 행을 조회

참고:
LIMIT 10 OFFSET 0 → 1번째 행부터 10개 조회 (1~10번째 행)
LIMIT 10 OFFSET 10 → 11번째 행부터 10개 조회 (11~20번째 행)

LIMIT과 OFFSET 조합

MySQL에서는 다음과 같이 LIMIT, OFFSET을 함께 쓰는 것이 일반적이다.

SELECT * FROM 테이블
LIMIT 가져올_개수 OFFSET 건너뛸_개수;

예:

SELECT * FROM products
ORDER BY id
LIMIT 20 OFFSET 40;
  • 상품 목록에서 41번째부터 20개 출력 (3페이지)
반응형

LIMIT + ORDER BY 조합은 필수

데이터를 순서 없이 LIMIT만으로 잘라서 출력하면
매번 다른 결과가 나올 수 있다.
따라서 정렬 기준을 명시해야 한다.

SELECT * FROM posts
ORDER BY created_at DESC
LIMIT 10;
  • 최신 게시글 10개 출력 (정렬 기준: 작성일)

🧪 실전 예제: 회원 페이지네이션

SELECT id, name, created_at
FROM members
ORDER BY created_at DESC
LIMIT 10 OFFSET 0;  -- 첫 번째 페이지
SELECT id, name, created_at
FROM members
ORDER BY created_at DESC
LIMIT 10 OFFSET 10;  -- 두 번째 페이지
  • 이처럼 페이지 수 = OFFSET / LIMIT, 즉 OFFSET = (페이지번호 - 1) * 페이지당 건수로 계산하면 된다.
반응형

🚀 페이징 쿼리 성능 주의사항

  • OFFSET이 커질수록 성능이 저하될 수 있음
  • 특히 수십만 건 데이터에서 OFFSET 100000 같은 쿼리는 지양해야 함
  • 인덱스 기반으로 WHERE + ID를 조합한 Keyset Pagination 방식이 성능에 유리함

예:

SELECT * FROM users
WHERE id > 5000
ORDER BY id
LIMIT 10;
  • OFFSET을 쓰지 않고도 특정 위치부터 데이터를 가져올 수 있음

📎 공식 문서 참고

MySQL SELECT LIMIT 문서
https://dev.mysql.com/doc/refman/8.0/en/select.html

반응형