참고
페이지네이션 최적화
NOTE
페이징 기능은 API에서 페이지 번호와 상품 개수를 돌려줘야한다. 어떻게 하면 대용량의 데이터에서도 빠르게 이러한 정보를 줄 수 있는가?
오프셋 기반
NOTE
OFFSET과 LIMIT를 사용하는 방식이다!
# LIMIT -> 결과 중 처음부터 몇개만 가져오기
SELECT *
FROM 테이블명
LIMIT 10; -- 처음 부터 10개만 출력하기 (1 ~ 10)
SELECT *
FROM 테이블명
LIMIT 100, 10; -- 100번째부터 그 후 10개 출력하기 (101 ~ 110)
# OFFSET -> 어디서 부터 가져올지
SELECT * FROM 테이블명
LIMIT 20
OFFSET 5; -- 5번째 행 부터 25행 까지 출력 (6 ~ 25)
-- limit 5, 20 과 같다고 보면 된다.
SELECT *
FROM 테이블명
LIMIT 5, 20
SQL
복사
LIMIT와 OFFSET을 활용한 페이징기법
이 방법의 가장 큰 문제점은 앞에 읽었던 행을 다시 읽어야함!
•
OFFSET 번호가 뒤로 갈수록 느려진다
◦
뒷페이지를 읽더라도 앞에서 읽었던 행을 버리지만 다시 읽기 때문이다.
◦
ex) offset 10000 limit 20 → 10,020개의 행을 읽어야 한다.
커서 기반
NOTE
다음 페이지네이션을 PK를 기반으로 구하는 방식을 말한다!
직전 조회 결과의 마지막 ID를 넘겨서 다음 페이지를 조회한다.
# 키가 없는 경우
SELECT *
FROM post
WHERE memberId in (2)
ORDER BY id DESC
LIMIT 10;
# 키가 있는 경우
SELECT *
FROM post
WHERE memberId in (2) and id < 1999991
ORDER BY id DESC
LIMIT 10;
SQL
복사
ex) key 3, size 5 → key 8 ⇒ 다음 조회시 key 8, size 5 → key 13
•
조회 시작 부분을 인덱스로 빠르게 찾아 매번 첫 페이지만 읽도로 하는 방식
•
아무리 페이지가 뒤로 가더라도 처음 페이지를 읽는 것과 동일한 성능을 가지게 된다.
커버링 인덱스
NOTE
검색 조건이 인덱스에 부합한다면 테이블에 바로 접근하지 않고 인덱스로만 데이터 응답을 내려주는 방식!
•
커버링 인덱스는 쿼리를 충족시키는데 필요한 모든 데이터를 갖고 있는 인덱스를 의미한다.
◦
select, where, order by, limit, group by 등에서 사용되는 모든 컬럼이 Index 컬럼안에 모두 들어가는 경우
왜 빠름?
인덱스 조회시 성능저하 1순위는 인덱스를 검색하고 대상이 되는 row의 나머지 컬럼값을 읽을 때
반대로 커버링 인덱스 방식을 이용하면 where, order by를 인덱스 검색으로 빠르게 처리하고 걸러진 10개의 row만 처리한다.