Search
Duplicate
📒

[Database Study] 02-2. 페이지네이션 최적화(offset, cursor, covering Index)

상태
미진행
수업
Database Study
주제
4 more properties
참고

페이지네이션 최적화

NOTE
페이징 기능은 API에서 페이지 번호상품 개수를 돌려줘야한다. 어떻게 하면 대용량의 데이터에서도 빠르게 이러한 정보를 줄 수 있는가?

오프셋 기반

NOTE
OFFSETLIMIT를 사용하는 방식이다!
# 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 2010,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만 처리한다.