핵심 차이

필요한 컬럼이 모두 인덱스 안에 있으면 테이블 재접근이 사라집니다.

커버링 인덱스는 검색 조건과 반환 컬럼을 인덱스 안에서 모두 해결합니다. 같은 쿼리라도 테이블까지 내려가지 않으므로 읽기 경로가 짧아지고 I/O가 줄어듭니다.

인덱스에 저장
user_id, order_date, total_amount
쿼리가 필요로 하는 값
WHERE user_id + SELECT order_date, total_amount
예시 쿼리
CREATE INDEX idx_orders_cover
ON orders(user_id, order_date, total_amount);

SELECT order_date, total_amount
FROM orders
WHERE user_id = 100;
비교 항목
일반 인덱스 조회 2번의 I/O
커버링 인덱스 조회 1번의 I/O
읽는 경로
인덱스 탐색 ROWID 확인 테이블 접근 결과 반환
인덱스 탐색 인덱스에서 바로 결과 반환
추가 테이블 접근
인덱스에 없는 반환 컬럼을 읽기 위해 테이블 방문이 필요합니다.
반환 컬럼까지 인덱스에 있으므로 테이블 방문이 필요 없습니다.
비용 차이
2 = 인덱스 + 테이블
1 = 인덱스만 읽음
실행 계획 단서
추가 테이블 접근이 남아 있으면 인덱스만으로는 결과가 끝나지 않습니다.
MySQL EXPLAIN에서 Extra = "Using index"가 보일 수 있습니다.
복합 인덱스 설계 순서
검색과 정렬을 앞에서 처리하고, 반환 컬럼은 뒤에서 덮습니다.
1. WHERE 조건
user_id
먼저 좁혀야 인덱스 탐색 범위가 작아집니다.
2. ORDER BY 컬럼
order_date
정렬을 인덱스 순서로 이어서 처리합니다.
3. SELECT 커버
total_amount
마지막에 필요한 반환 컬럼까지 넣어 테이블 접근을 없앱니다.