SQL/성능 개선

Index Lookup vs Covering Index Lookup

가지코딩 2025. 7. 4. 00:58

Index Lookup 이란?

인덱스로 조건에 맞는 row를 찾고, 그 뒤에 실제 테이블(클러스터드 인덱스)에서 필요한 데이터를 가져오는 방식

 

 

예시 쿼리

SELECT * FROM users WHERE nickname = 'nickname999999';

 

* EXPLAIN ANALYZE

+-------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN                                                                                                                                         |
+-------------------------------------------------------------------------------------------------------------------------------------------------+
| -> Index lookup on users using idx_user_nickname (nickname = 'nickname999999')  (cost=0.37 rows=1) (actual time=0.0349..0.0372 rows=1 loops=1)
 |
+-------------------------------------------------------------------------------------------------------------------------------------------------+

 

 

작동 방식

  1. nickname 인덱스에서 해당 값을 찾는다.
  2. 인덱스에는 nickname만 있으므로,
  3. 실제 테이블로 이동하여 나머지 컬럼 데이터를 가져온다.

 

특징

  • 추가적인 테이블 접근 비용이 존재
  • 쿼리 대상 컬럼이 인덱스에 없으면 반드시 테이블 접근이 필요

Covering Index Lookup 이란?

쿼리에 필요한 모든 컬럼이 인덱스에 포함되어 있어, 테이블을 전혀 읽지 않고 인덱스만으로 결과를 반환하는 방식

 

예시 쿼리

SELECT nickname FROM users WHERE nickname="nickname999999";

 

* EXPLAIN ANALYZE

+--------------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN                                                                                                                                                |
+--------------------------------------------------------------------------------------------------------------------------------------------------------+
| -> Covering index lookup on users using idx_user_nickname (nickname = 'nickname999999')  (cost=1.1 rows=1) (actual time=0.012..0.0135 rows=1 loops=1)
 |
+--------------------------------------------------------------------------------------------------------------------------------------------------------+

 

 

작동 방식

  1. 인덱스에서 nickname = 'nickname999999'을 찾음
  2. 쿼리에 필요한 정보가 인덱스에 모두 존재
  3. 테이블로 접근하지 않고, 인덱스만으로 결과를 반환

 

특징

  • 테이블 접근 생략 → 디스크 I/O 최소화
  • 빠른 응답속도, 특히 읽기 많은 서비스에서 매우 유리
  • 조건 + SELECT 대상 컬럼이 인덱스에 모두 포함되어야 가능

Index Lookup vs Covering Index Lookup

구분 Index Lookup Covering Index Lookup
테이블 접근 인덱스 + 테이블 row 인덱스만 사용
속도 보통 더 빠름 (I/O 적음)
인덱스에 필요한 컬럼 일부만 있어도 됨 쿼리 사용 컬럼 전부 포함되어야 함
활용 조건 WHERE에만 인덱스 컬럼 사용 WHERE + SELECT 컬럼 모두 인덱스 포함
단점 테이블 접근 필요 → I/O 증가 인덱스에 모든 컬럼을 포함해야 함 → 인덱스 크기 증가
실전 예시 SELECT * SELECT nickname

 

  • Index Lookup: 일반적인 인덱스 조회 → 테이블 row 접근 필요
  • Covering Index Lookup: 인덱스만으로 완전 처리 → 더 빠름

Covering Index 사용 판단 기준

상황 Covering Index 적합도
읽기 비중이 높고, 자주 조회되는 컬럼만 조회 ✅ 매우 적합
쓰기(UPDATE/INSERT) 비중이 높고, 자주 수정되는 컬럼 포함 ❌ 부적합 (오히려 성능 저하 우려)
자주 쓰이는 컬럼이 제한적이고, 쓰기 비중도 적당한 경우 ⚠️ 선택적으로 사용 가능

 

 

실무 팁

  • SELECT *는 피해야 한다
    필요한 컬럼만 명시적으로 선택하여 커버링 인덱스를 활용할 수 있도록 한다.
  • 커버링 인덱스 설계 전에 조회 패턴을 분석해야 한다
    자주 사용하는 WHERE 조건과 SELECT 컬럼 조합을 파악하여 인덱스에 포함할 컬럼을 신중하게 결정한다.
  • 쓰기 작업이 많은 테이블은 인덱스 크기와 갱신 비용을 반드시 고려해야 한다
    커버링 인덱스는 인덱스 크기를 키우고 쓰기 시 인덱스 갱신 비용을 증가시켜 무분별한 인덱스 추가는 피하는 것이 좋다.

 

* 읽기 성능 vs 쓰기 비용 균형

  • 읽기 성능 향상은 쓰기 비용 증가로 이어지는 상호 연관 관계가 있다
  • 읽기 중심 시스템에서는 커버링 인덱스가 매우 효과적이나, 쓰기 중심 시스템에서는 오히려 성능 저하를 유발할 수 있으므로 신중히 설계할 것

'SQL > 성능 개선' 카테고리의 다른 글

EXPLAIN ANALYZE 활용법  (0) 2025.07.04