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은 인덱스 컬럼이므로 인덱스 자체에 모든 정보가 포함되어 있습니다.

테이블에 접근할 필요 없이 인덱스만으로 조회 완료 가능
→ 이 인덱스를 커버링 인덱스라고 부릅니다.