인덱싱은 데이버베이스 성능 최적화의 핵심!
인덱스는 도서관의 목차와 같은 역할
데이터베이스 테이블에서 특정 값을 빠르게 찾기 위해 사용하는 자료구조
| 항목 | 설명 |
|---|---|
| 🔍 조회 속도 향상 | WHERE, JOIN, ORDER BY, GROUP BY 절이 빨라짐 |
| 📈 성능 최적화 | 대량 데이터 처리 시 효율 증가 |
| 항목 | 설명 |
|---|---|
| 💾 저장공간 사용 | 인덱스도 별도 저장공간 차지 |
| 🐢 DML 성능 저하 | INSERT, UPDATE, DELETE 시 인덱스도 갱신해야 하므로 느려짐 |
| ⚠️ 과도한 인덱스 | 너무 많은 인덱스는 오히려 성능 악화 |
균형 이진 트리 기반
대부분의 RDBMS는 기본 인덱스로 B-Tree 사용
빠른 동등 비교 (=) 연산에 특화
범위 검색은 불가
GIN / GiST 인덱스: PostgreSQL 특화
Full-Text 인덱스: 문자열 검색 최적화
| 종류 | 설명 | 예시 |
|---|---|---|
| 🌱 기본 인덱스 (Single Column) | 하나의 컬럼에만 적용 | CREATE INDEX idx_name ON table(col); |
| 🌿 복합 인덱스 (Composite Index) | 여러 컬럼을 묶어서 인덱스 생성 | ON table(col1, col2) |
| 🌵 유니크 인덱스 (Unique Index) | 중복 허용 X, 고유값 유지 | CREATE UNIQUE INDEX ... |
| 🌾 프라이머리 키 인덱스 | PK 제약조건이 인덱스를 자동 생성 | PRIMARY KEY (id) |
| 🌴 커버링 인덱스 | SELECT 절에 포함된 모든 컬럼이 인덱스에 있는 경우 | |
| 🍄 클러스터형 인덱스 | 실제 데이터의 물리적 정렬에 영향을 주는 인덱스 (MySQL InnoDB는 PK가 클러스터 인덱스) |
인덱스가 실제 데이터를 정렬된 상태로 저장하는 인덱스
인덱스와 실제 데이터가 따로 저장되는 인덱스
| 항목 | 클러스터 인덱스 🌳 | 논클러스터 인덱스 🌿 |
|---|---|---|
| 실제 데이터 정렬 | O (인덱스 순서대로 정렬) | X (따로 저장됨) |
| 인덱스 수 | 1개만 가능 | 여러 개 가능 |
| 접근 속도 | 빠름 (한 번에 접근) | 느림 (인덱스 → 테이블 두 번 접근) |
| 기본 적용 | Primary Key (기본 적용) | 일반 인덱스 (Secondary Index) |
| 사용 예 | 자주 정렬/범위검색 하는 PK | 특정 조건 자주 조회되는 컬럼 |
🔸 MySQL(InnoDB)의 경우, 기본적으로 PK = 클러스터 인덱스
🔸 그 외 나머지 인덱스는 전부 논클러스터 인덱스
🔸 범위 검색이나 정렬이 중요한 경우 → 클러스터 인덱스를 잘 설계
🔸 WHERE 절에 자주 등장하는 컬럼 → 논클러스터 인덱스 생성
B-트리는 균형 잡힌 M-진 트리, 데이터베이스나 파일시스템처럼 대용량 데이터를 디스크 기반으로 효율적으로 탐색하기 위해 만들어진 자료구조
[30]
/ \
[10,20] [40,50]
| 이진 탐색 트리 (BST) | B-트리 |
|---|---|
| 한 노드에 키 1개 | 한 노드에 키 여러 개 가능 |
| 자식 노드 2개 | 자식 노드 M개 가능 (M ≥ 2) |
| 깊이가 깊어질 수 있음 | 트리의 깊이를 얕게 유지 가능 |
B-트리는 많은 데이터를 빠르게 찾기 위해 트리의 높이를 낮춘 자료구조이고,
데이터베이스는 이를 활용해 디스크 I/O를 최소화하며 빠르게 탐색한다!