MySQL에서 페이징 처리

SHONG·2024년 7월 28일

SQL

목록 보기
14/15
post-thumbnail

LIMIT, OFFSET절

문법
SELECT 컬럼명 FROM 테이블명
LIMIT 페이지당데이터수 OFFSET 시작_위치;

기본 방식

SELECT * FROM tbl_board
LIMIT 10 OFFSET 0;  -- 첫 번째 페이지

SELECT * FROM tbl_board
LIMIT 10 OFFSET 10;  -- 두 번째 페이지

SELECT * FROM tbl_board
LIMIT 10 OFFSET 20;  -- 세 번째 페이지

10개의 레코드를 한 페이지로 보여주는 쿼리이다.


페이지 번호를 이용한 페이징

SET @page = 1;  -- 페이지 번호
SET @pageSize = 10;  -- 페이지 당 레코드 수

SELECT * FROM tbl_board
LIMIT @pageSize OFFSET (@page - 1) * @pageSize;

성능 고려 사항

  • 큰 OFFSET값이 있는 쿼리는 성능이 저하될 수 있다.
  • GROUP BY나 ORDER BY 등 조건절이 있는 경우 모든 레코드를 읽고 후처리를 한 이후 결과값을 반환하기 때문에 LIMIT을 사용하여 얻을 수 있는 성능적 향상을 취하기 어렵다.
  • 조건절이 있더라도 인덱스를 이용해 처리될 때에는 그 단계 자체가 생략되므로 각 단계에서 인덱스를 적절히 사용하거나, 절차를 줄여주는 노력이 필요하다.
-- 인덱스 생성
CREATE INDEX idx_id ON tbl_board(id);

-- 페이지 설정
SET @page = 3;  -- 페이지 번호
SET @pageSize = 10;  -- 페이지당 레코드 수

-- 서브쿼리를 활용한 페이징
SELECT * FROM tbl_board
WHERE id > (
  SELECT id FROM tbl_board ORDER BY id LIMIT @pageSize * (@page - 1), 1
)
ORDER BY id
LIMIT @pageSize;
profile
핑계 대지 말자

0개의 댓글