예시 쿼리
SELECT order_date, total FROM orders WHERE user_id = 1001;
찾는 조건은 같고, 차이는 필요한 컬럼이 인덱스 안에 있느냐입니다.
커버링 인덱스 예시
CREATE INDEX idx_covering ON orders(user_id, order_date, total);
WHERE와 SELECT에 쓰는 컬럼을 한 엔트리 안에 담아 둡니다.
비교 지점
일반 인덱스
`user_id`만 인덱스에 있음
커버링 인덱스
`user_id`, `order_date`, `total`을 함께 보관
인덱스 엔트리
user_id
ROWID
조회할 order_date, total은 아직 테이블에 남아 있습니다.
user_id
order_date
total
필요한 컬럼이 같은 인덱스 엔트리에 들어 있어 추가 조회가 줄어듭니다.
읽기 경로
1단계인덱스에서
ROWID 찾기
→
2단계테이블로 이동해
order_date, total 읽기
1단계인덱스에서 조건 확인
→
2단계같은 엔트리에서
order_date, total 바로 반환
결과
테이블 랜덤 I/O 발생
매칭되는 행마다 테이블 접근이 추가되어 비용이 커집니다.
테이블 접근이 필요 없음
인덱스만 읽고 응답하므로 같은 조건에서도 더 빠르게 끝납니다.