SQL 인덱스 치트시트 — 언제 타고, 언제 안 타나
2026-01-11 · 1 min read
인덱스는 공짜가 아니다
읽기를 빠르게 하는 대신 쓰기를 느리게 하고 저장공간을 먹는다. 모든 컬럼에 인덱스를 거는 건 안티패턴이다. 쿼리 패턴을 보고 건다.
복합 인덱스: 컬럼 순서가 전부
INDEX (a, b, c) 는 왼쪽부터 접두사로만 탄다.
| 쿼리 조건 | 인덱스 사용 |
|---|---|
WHERE a = ? | ✅ |
WHERE a = ? AND b = ? | ✅ |
WHERE b = ? | ❌ (a를 건너뜀) |
WHERE a = ? AND c = ? | 부분 (a만) |
규칙: 등호(=) 조건 컬럼을 앞에, 범위(<, >) 조건을 뒤에.
커버링 인덱스
쿼리가 필요로 하는 컬럼을 인덱스가 다 포함하면, 테이블을 안 읽고 인덱스만으로
답한다. SELECT 컬럼까지 인덱스에 넣는 트릭.
인덱스가 무시되는 조건
- 컬럼에 함수·연산:
WHERE YEAR(created) = 2026→ 인덱스 무시 →WHERE created >= '2026-01-01'로 고쳐 쓴다 - 앞에 와일드카드:
LIKE '%foo'→ 못 탐.'foo%'는 탐 - 타입 불일치: 문자열 컬럼에 숫자 비교 → 암묵 변환으로 무시
- 낮은 선택도: 값 종류가 적으면(성별 등) 옵티마이저가 풀스캔 선택
검증은 EXPLAIN으로
추측하지 말고 EXPLAIN(또는 EXPLAIN ANALYZE)으로 실제 실행 계획을 본다.
Seq Scan이 뜨면 인덱스를 안 탄 것. Index Scan이 목표.
한 줄 요약
쿼리 패턴 → 복합 인덱스 컬럼 순서 → EXPLAIN으로 검증. 이 순서다.