[SQL] 페이징 쿼리 최적화

Dev. 로티·2022년 1월 20일
1

데이터베이스

목록 보기
4/4
post-thumbnail

기본적으로 Mysql에서는 페이징을 위해 LIMIT이라는 키워드를 지원하고 있다.

우리가 흔히 사용하는 일반적인 LIMIT을 사용한 페이징을 offset 페이징이라고 하는데,

대규모 서비스를 진행중인 상황에서 성능적인 부분에서 굉장히 치명적인 문제를 야기할 수 있음을 반드시 숙지하고 있어야한다.

먼저 예시를 확인해보자.

SELECT p.id, p.name, p.price
FROM product p
LIMIT 3000000, 100

위의 쿼리가 있다고 가정해보자. 보기론 전혀 문제없어 보이는 쿼리이다.
하지만 커버링 인덱스를 적용했다면 큰 문제는 피할 수도 있으나, 커버링 인덱스를 적용하지 않은 상황이라면 3000100의 디스크 I/O가 발생할 것이다.

3000100번의 디스크 I/O가 발생하는 이유는 LIMIT의 동작 원리상 page + size만큼 조회후 page 만큼의 데이터를 버리기 때문


ex) 해결 방안 예시

SELECT p.id, p.name, p.price
FROM product p, (SELECT id
				   FROM product
				    LIMIT 3000000, 100) sp
WHERE p.id = sp.id

커버링 인덱스를 등록함으로써 해결할 수도 있지만,
인라인뷰에서 클러스터 인덱스를 사용해 id를 조회후 그것을 조인하는 방법을 사용해 개선할 수도 있다.

0개의 댓글