index는 데이터베이스가 전체 테이블을 스캔하지 않고도 행을 빠르게 찾을 수 있게 해주는 자료 구조(보통 B-tree)입니다. 책의 색인과 비슷합니다. 추가 저장 공간과 느려진 쓰기를 대가로, index가 걸린 컬럼에 대한 조회, 필터링, join, 정렬을 극적으로 빠르게 합니다.
index가 어떻게 도움이 되는가
users email ;
INDEX idx_users_email users(email);
index가 없으면 데이터베이스는 full table scan(모든 행 확인)을 수행합니다. index가 있으면 B-tree를 탐색하여 로그 시간에 매칭되는 행을 찾습니다. 수백만 행을 스캔하는 것과 몇 번의 조회의 차이입니다.
✓ WHERE 절의 컬럼 (자주 필터링됨)
✓ JOIN에 사용되는 컬럼 (특히 foreign key)
✓ ORDER BY의 컬럼 (정렬이 index를 사용할 수 있음)
✓ 선택도(SELECTIVITY)가 높은 컬럼 (서로 다른 값이 많음 — email, id)
✓ primary key (자동 index됨)와 unique 제약
✗ 거의 조회되지 않는 컬럼 — 낭비되는 저장 공간과 쓰기 오버헤드
✗ 작은 테이블 — full scan이 이미 빠름; index는 이득이 없음
✗ 선택도가 낮은 컬럼 (예: 값이 2개인 boolean) — index가 거의 도움 안 됨
✗ 쓰기가 잦은 컬럼 — 모든 INSERT/UPDATE/DELETE가 index도 갱신해야 함
→ index가 너무 많으면 쓰기가 크게 느려짐
index는 공짜가 아닙니다: 저장 공간을 소비하고 쓰기를 느리게 합니다(모든 수정이 index를 갱신해야 함). 과도한 index는 쓰기 성능을 해칩니다.
CREATE INDEX idx_users_country_name ON users(country, name); -- COMPOSITE (다중 컬럼)
-- WHERE country = ? AND name = ?, 그리고 WHERE country = ? (가장 왼쪽 prefix)에 도움
-- 하지만 WHERE name = ? 단독에는 도움 안 됨 (순서가 중요!)
CREATE UNIQUE INDEX ... -- 유일성 강제
-- 그 외: partial index, covering index, GIN/GiST (Postgres) 등 특수 데이터용
index는 데이터베이스 성능에서 가장 중요한 주제 중 하나입니다. 쿼리를 빠르게 만드는 주요 도구이며, 언제 어떻게 사용하는지 이해하는 것은 대규모 데이터베이스를 다루는 누구에게나 필수적인 지식입니다.
핵심 가치는 극적입니다: index가 없으면 컬럼에 대해 필터링, join, 정렬하는 쿼리는 full table scan(모든 행 확인 — 데이터가 커지면 치명적으로 느림)이 필요하지만, index는 이를 빠른 로그 시간 조회로 바꿉니다. 종종 쿼리가 밀리초가 걸리느냐 수 초/수 분이 걸리느냐의 차이입니다.
언제 index를 만들어야 하는지(자주 필터링되는 WHERE 컬럼, JOIN/foreign key 컬럼, ORDER BY 컬럼, 선택도가 높은 컬럼) 이해하는 것은 쿼리 성능에 기본적입니다.
똑같이 중요한 것은 트레이드오프와 언제 index를 만들지 말아야 하는지 이해하는 것입니다: index는 저장 공간을 소비하고, 결정적으로 쓰기를 느리게 합니다(모든 INSERT/UPDATE/DELETE가 모든 index를 갱신해야 함). 따라서 과도한 index는 쓰기 성능을 해치고, 작은 테이블이나 선택도가 낮은 컬럼에서는 index가 거의 가치가 없습니다.
이 균형 — 조회되는 것에는 index를 만들되 과도하게 만들지 않는 것 — 이 핵심 역량입니다.
composite index(다중 컬럼, 어떤 쿼리에 도움이 되는지에 컬럼 순서가 중요)를 아는 것은 실용적인 index 지식을 완성합니다.
실제 애플리케이션에서 쿼리 성능이 중요하고, 적절한 인덱싱(올바른 컬럼에 올바른 index, 읽기 속도와 쓰기 비용 및 저장 공간의 균형)이 가장 영향력 큰 데이터베이스 최적화이므로, index를 숙달하는 것 — 작동 원리, 사용 시점, 쓰기/저장 공간 트레이드오프, composite index — 은 성능 좋은 데이터베이스를 위한 핵심적이고 가치 높은 지식이자 가장 중요하고 자주 출제되는 데이터베이스 주제 중 하나입니다.