SQL
[DB Optimization#8] 커버링 인덱스(Covering Index)란?
j.d
2025. 4. 17. 02:48
커버링 인덱스란?
MySQL에서 인덱스는 보통 필터링과 정렬을 빠르게 하기 위해 사용됩니다.
하지만 인덱스가 하는 일은 거기서 끝나지 않습니다.
인덱스만으로도 SQL의 결과를 바로 조회할 수 있다면 훨씬 빠르게 쿼리를 처리할 수 있습니다.
이처럼,
SQL 실행에 필요한 모든 컬럼이 인덱스에 포함되어 있어, 테이블(데이터 영역)에 접근하지 않아도 되는 인덱스를
우리는 커버링 인덱스(Covering Index) 라고 부릅니다.
커버링 인덱스를 왜 쓰는가?
간단합니다.
- 인덱스에만 접근하면 되므로 속도가 빠릅니다.
- 테이블 데이터까지 내려가서 가져오는 I/O를 줄일 수 있습니다.
- 결과적으로 디스크 접근량 감소 → 실행 속도 개선으로 이어집니다.
예시로 이해해보겠습니다.
아래는 users 테이블입니다.
id | name | created_at |
1 | 김민재 | 2024-01-01 |
2 | 박미나 | 2024-01-03 |
... | ... | ... |
그리고 name 컬럼에 인덱스가 설정되어 있다고 가정해봅시다.
CREATE INDEX idx_name ON users(name);
이제 아래 두 개의 쿼리를 비교해보도록 하겠습니다.
1)
SELECT id, created_at
FROM users;
이 경우, name 인덱스에는 id나 created_at 정보가 없기 때문에
MySQL은 인덱스를 이용해 먼저 필터링한 뒤,
실제 테이블(데이터 영역)에 접근해 필요한 컬럼들을 다시 가져옵니다.
→ 즉, 두 번 접근해야 함
→ 성능 느릴 수 있음
2)
SELECT id, name
FROM users;
이 경우, id는 기본키이기 때문에 인덱스에 항상 포함되어 있고,
name은 인덱스 컬럼이므로 인덱스 자체에 모든 정보가 포함되어 있습니다.
→ 테이블에 접근할 필요 없이 인덱스만으로 조회 완료 가능
→ 이 인덱스를 커버링 인덱스라고 부릅니다.