커버링 인덱스 (Covering Index)
핵심 개념
쿼리에 필요한 모든 컬럼이 인덱스에 포함되어, 테이블 데이터를 읽지 않아도 되는 인덱스.
[일반 인덱스 조회]
1. 인덱스에서 조건 검색
2. 테이블로 이동 (랜덤 I/O) ← 느림!
3. 나머지 컬럼 읽기
[커버링 인덱스 조회]
1. 인덱스에서 조건 검색
2. 인덱스에서 바로 결과 반환 ← 빠름!
→ 테이블 접근 불필요!
EXPLAIN으로 확인
EXPLAIN SELECT user_id, status
FROM orders
WHERE user_id = 123;
-- Extra: Using index ← 커버링 인덱스!
Using index가 표시되면 커버링 인덱스가 동작한 것.
실무 예시
-- 인덱스 생성
CREATE INDEX idx_orders_cover
ON orders (user_id, status, created_at);
-- 커버링 O: 모든 컬럼이 인덱스에 포함
SELECT status, created_at
FROM orders
WHERE user_id = 123;
-- 커버링 X: total_price가 인덱스에 없음
SELECT status, total_price
FROM orders
WHERE user_id = 123;
성능 차이
| 항목 | 일반 인덱스 | 커버링 인덱스 |
|---|---|---|
| 테이블 접근 | 필요 (랜덤 I/O) | 불필요 |
| 대량 데이터 | 느림 | 수배~수십배 빠름 |
| EXPLAIN | Using where | Using index |
트레이드오프
장점:
- 읽기 성능 대폭 향상
- 디스크 I/O 감소
단점:
- 인덱스 크기 증가 (컬럼 추가)
- INSERT/UPDATE 성능 저하
- 메모리 사용량 증가
설계 팁
SELECT 절에 * 대신 필요한 컬럼만!
→ 커버링 인덱스 활용 가능성 ↑
자주 조회하는 패턴 분석
→ 해당 컬럼들로 인덱스 구성