Composite Index & Covering Index
복합 인덱스와 커버링 인덱스의 개념 정리 (MySQL / PostgreSQL 기준)
SQL 튜닝 시 자주 등장하지만 헷갈리는 개념 두 가지, 간단히 정리합니다.
1. Composite Index (복합 인덱스)
하나의 인덱스에 여러 컬럼을 순서 있게 결합한 인덱스입니다.
예를 들어, (user_id, created_at) 형태로 인덱스를 만들면 user_id → created_at 순서로 정렬되어 저장됩니다.
CREATE INDEX idx_user_created ON users (user_id, created_at);
특징
- 앞쪽 컬럼부터 순서대로 사용해야 인덱스가 효율적으로 작동합니다.
WHERE user_id = 10또는WHERE user_id = 10 AND created_at > '2025-01-01'은 인덱스를 사용합니다.- 하지만
WHERE created_at > '2025-01-01'단독 조건은 인덱스를 탈 수 없습니다.
-- 효율적 (첫 번째 컬럼부터 순서 사용)
SELECT * FROM users WHERE user_id = 10;
-- 효율적 (user_id + created_at 조합 사용)
SELECT * FROM users WHERE user_id = 10 AND created_at > '2025-01-01';
-- X (두 번째 컬럼만 사용)
SELECT * FROM users WHERE created_at > '2025-01-01';
즉, **Composite Index는 순서가 생명**입니다.
정렬(ORDER BY), 그룹(GROUP BY), 조인 키에서도 동일한 규칙이 적용됩니다.
2. Covering Index (커버링 인덱스)
커버링 인덱스는 쿼리를 처리할 때 필요한 모든 컬럼이 인덱스 안에 존재하여, 실제 테이블 데이터를 읽지 않고 인덱스만으로 결과를 반환할 수 있는 경우를 말합니다.
-- 인덱스 생성
CREATE INDEX idx_user_covering ON users (user_id, email, created_at);
-- 커버링 인덱스 활용
SELECT user_id, email FROM users WHERE user_id = 10;
특징
- SELECT에서 필요한 컬럼이 모두 인덱스에 포함되어 있으면 테이블 접근(=랜덤 I/O)을 생략합니다.
- 이를 Index Only Scan이라고 부릅니다 (PostgreSQL, MySQL InnoDB 공통).
- 쿼리 성능이 빠르게 향상되며, 읽기 중심 서비스에 유용합니다.
-- Index Only Scan 발생 (테이블 접근 X)
EXPLAIN ANALYZE SELECT user_id, email
FROM users
WHERE user_id = 10;
하지만 SELECT 구문에 인덱스에 없는 컬럼이 포함되면,
일반 Index Scan → Table Lookup으로 바뀌어 성능 이점이 사라집니다.
Composite + Covering 인덱스 조합
실무에서는 복합 인덱스를 잘 설계하여 동시에 커버링 효과까지 얻는 경우가 많습니다.
CREATE INDEX idx_user_full ON users (user_id, created_at, email); -- user_id + created_at 조건 + email 조회 → 인덱스만으로 처리 가능 SELECT email FROM users WHERE user_id = 10 AND created_at > '2025-01-01';
정리
- Composite Index → 여러 컬럼을 순서 있게 묶은 인덱스
- Covering Index → 쿼리의 모든 컬럼이 인덱스 안에 포함되어 테이블 접근이 불필요
- 두 개념은 별개지만, 복합 인덱스를 잘 설계하면 커버링 효과도 얻을 수 있다.
읽어주셔서 감사합니다
가독성이나 표현 방식에 대한 피드백은 언제든 환영입니다!
728x90
728x90
'Dev > [기타]개발' 카테고리의 다른 글
| [개인프로젝트] 대한민국 랜덤 여행 지역 뽑기 웹서비스 소개 (1) | 2025.12.26 |
|---|---|
| [CTE MATERIALIZED] PostgreSQL의 MATERIALIZED / NOT MATERIALIZED 이해하기 (0) | 2025.10.28 |
| C++ / OpenCV 번호판 인식 / OpenCV를 활용하여 자동차 번호판 위치 인식하기. (0) | 2025.09.30 |
| Mac 사용중인 포트 번호 확인하기 및 포트 삭제 (0) | 2025.03.25 |
| 도커, 컨테이너, 쿠버네티스트 이게 뭐지? (0) | 2025.02.04 |