대용량 처리 이해/Mysql

페이지네이션 최적화

훈지런 2022. 12. 25. 15:30

오프셋 기반 페이징시 문제

  1. 마지막 페이지를 구하기 위해 전체 개수를 구해야 한다.
  2. 오프셋 이전의 데이터를 다시 읽어온다. (불필요한 데이터 조회 발생)

대안 : 커서 기반 페이징

  1. 페이지 번호가 아닌 키 번호를 전달받음
    • 전달받은 키 이전의 데이터는 조회하지 않음.
  2. 마지막 키 번호를 반납함.
  3. 그러나 게시판 형태의 UI구현이 어렵다.

커버링 인덱스

검색 조건이 인덱스에 부합할 때 테이블에 바로 접근 하기보다 인덱스를 통해 접근하는 것이 더 빠르기 때문에 인덱스를 통해서 테이블로 흐른다.
그렇기 때문에 커버링 인덱스는 테이블까지 접근하지 않고 인덱스를 데이터를 내려준다.

 

예를 들어

 

나이 id
19 3
27 2
32 1
45 4

-> 인덱스 테이블

 

id 이름 성별 나이 직업
1 이훈재 35 개발자
2 홍길동 35 도적
3 유관순 18 학생
4 이순신 35 경찰

-> 회원 테이블(pk=id)

 

나이가 30 이하인 회원 둘 조회 시

SELECT
    id
FROM
    회원 
WHERE 나이 < 30
LIMIT 2

이렇게 쿼리문을 짜게 되면 테이블까지 조회 안 하고 바로 인덱스에서 데이터를 넘겨준다.
하지만

SELECT
    id,이름
FROM
    회원 
WHERE 나이 < 30
LIMIT 2

이렇게 인덱스에 없는 이름을 함께 조회하게 되면 테이블까지 조회하게 됨

WITH 커버링 AS (
    SELECT
        id
    FROM
        회원 
    WHERE 나이 < 30
    LIMIT 2
)
SELECT 이름
FROM 회원 INNER JOIN 커버링 ON 회원.id = 커버링.id

이렇게 활용하면 커버링 인덱스를 활용해서 조회하게 되면 불필요한 랜덤 데이터 액세스를 막을 수 있다.
ORDER BY, OFFSER, LIMIT 절로 인한 불필효한 데이터 블록 접근을 커버링 인덱스를 통해 최소화할 수 있다.

'대용량 처리 이해 > Mysql' 카테고리의 다른 글

트랜잭션  (0) 2022.12.27
CAP이론  (0) 2022.12.26
정규화  (0) 2022.12.24
인덱스  (3) 2022.12.23
데이터베이스 성능  (0) 2022.12.22