데이터베이스에서 대량의 데이터를 빠르게 검색하려면 어떻게 해야 할까?
바로 인덱스(Index)를 사용하는 것이다.
예를 들어, 아래와 같은 쿼리를 실행한다고 가정해본다면
SELECT * FROM users WHERE user_id = 123;
| 인덱스 종류 | 특징 |
|---|---|
| B-Tree 인덱스 | 범위 검색, 정렬 등 다양한 검색에 적합 |
| Hash 인덱스 | equal(=) 비교에 빠름, 범위 검색에는 부적합 |
| Bitmap 인덱스 | 중복값이 많은 컬럼에 적합 (예: 성별) |
| Full-Text 인덱스 | 텍스트 검색에 특화 (검색엔진 등) |
B-트리는 정렬된 데이터를 트리 형태로 저장하는 자료구조
대부분의 관계형 데이터베이스(MySQL, PostgreSQL 등)에서 기본 인덱스로 사용됨
검색, 삽입, 삭제 연산을 평균적으로 에 수행할 수 있다.
[30]
/ \
[10, 20] [40, 50]
/ | \ / | \
[5] [15] [25] [35] [45] [55]
예: WHERE age = 45
→ 루트에서 시작 → 45는 30보다 크므로 오른쪽
→ [40, 50] 에서 45는 40보다 크고 50보다 작으므로 중간 자식으로 이동
→ 리프 노드 [45] 도달 → 검색 성공
-- 단일 인덱스
CREATE INDEX idx_users_userid ON users(user_id);
-- 복합 인덱스
CREATE INDEX idx_users_name_email ON users(name, email);
검색 속도 향상: WHERE, JOIN, ORDER BY 절의 성능 향상
정렬 최적화: 정렬이 빠르게 처리됨
조인 성능 향상: 키 기반 검색 속도 증가
쓰기 성능 저하: INSERT/UPDATE/DELETE 시 인덱스도 갱신 필요
디스크 공간 추가 사용: 인덱스를 저장할 공간 필요
인덱스 남용 주의: 너무 많은 인덱스는 오히려 성능 저하
| 상황 | 인덱스 사용 여부 |
|---|---|
| WHERE 조건에 자주 사용되는 컬럼 | 권장 |
| JOIN에 사용되는 컬럼 | 권장 |
| ORDER BY 또는 GROUP BY 컬럼 | 권장 |
| 자주 수정되는 컬럼 | 주의 |
| 데이터 분포가 고르지 않은 컬럼 | 조건부 권장 |
EXPLAIN SELECT * FROM users WHERE user_id = 123;
| 인덱스 종류 | 설명 |
|---|---|
| 기본 인덱스 (PK) | 자동 생성, 유일값 보장 |
| 유니크 인덱스 (UNIQUE) | 중복 방지 목적 |
| 보조 인덱스 | 일반 인덱스 |
| 복합 인덱스 | 여러 컬럼 조합으로 생성된 인덱스 |
| 함수 기반 인덱스 | 함수 결과에 대한 인덱스 |
| 파셜 인덱스 (PostgreSQL) | 특정 조건을 만족하는 값만 인덱싱 |