BackEnd

커버링 인덱스

Raconer 2024. 1. 25. 00:40
728x90

커버링 인덱스

검색 조건이 인덱스에 부합하다면, 테이블에 바로 접근 하는 것 보다 인덱스를 통해 접근하는 것이 매우 빠르다.(절대적이진 않다.)

그렇다면 테이블에 접근하지 않고 인덱스로만 데이터 응답을 내려줄 순 없을까? -> 커버링 인덱스

(인덱스로만 커버 하겠다)

Index Table

나이 id
19 3
27 2
32 1
45 4

회원 Table

id 이름 성별 나이 직업
1 홍길동 32 경찰
2 김천사 27 목사
3 이순신 19 어부
4 김철수 45 개발자

1. 아래 쿼리를 실행하게 된다면..?

    SELECT 나이
    FROM 회원
    WHERE 나이 < 30
  1. Index Table에서 나이가 19, 27을 찾게 된다.
  2. 이후 회원 Table 에서 나머지 정보를 찾게 된다.

    하지만 원하는 정보는 '나이' 뿐이므로 굳이 회원 Table까지 갈 필요가 없다.

2. 그렇다면 아래 쿼리를 실행하게 된다면..?

    SELECT 나이, id
    FROM 회원
    WHERE 나이 < 30

id도 1. 번 쿼리 처럼 클러스터 인덱스로 존재 하기 때문에 커버링 인덱스 와 같이 실행이된다.

따라서

Mysql에서는 PK가 클러스터 인덱스이기 때문에 커버링 인덱스에 유리 하다

그렇다면 커버링 인덱스로 페이지네이션 최적화를 어떻게 할 수 있을까?

예) 나이가 30이하인 회원의 이름을 2개만 조회 한다면..?

    // ORDER BY, OFFSET, GROUP BY, LIMIT 절로 인한 불필요한 데이터블록 접근을 커버링 인덱스를 통해 최소화
    WITH 커버링 AS (
        SELECT id
        FROM 회원
        WHERE 나이 < 30
        LIMIT 2
    )

    SELECT 이름
    FROM 회원
    INNER JOIN 커버링 
        ON 회원.id = 커버링.id

따라서 커버링 인덱스란?

불필요한 데이터 엑세스 접근을 커버링 인덱스로 범위를 줄여 놓고 찾는 데이터만 데이터 엑세스를 하도록 하는 기법

728x90