인덱스(Index) 는 데이터베이스 테이블에서 데이터 검색 속도를 향상시키기 위한 보조적인 데이터 구조입니다.
일반적으로 책의 목차나 색인처럼, 원하는 정보를 빠르게 찾기 위해 사용됩니다.
목적: 빠른 검색, 정렬, JOIN 성능 향상
단점: 저장 공간 증가, 쓰기(INSERT/UPDATE/DELETE) 성능 저하
| 인덱스 없을 때 | 인덱스 있을 때 |
|---|---|
| 테이블 전체를 순차 검색 (Full Scan) | 원하는 위치를 빠르게 찾아서 접근 (Index Scan) |
| 속도 느림 (O(n)) | 속도 빠름 (O(log n) or better) |
| CPU·I/O 낭비 큼 | 리소스 절약 |
[Root]
|
[Internal Node]
|
[Leaf Node] → 실제 레코드 위치(ROWID 등) 연결
| 분류 기준 | 종류 | 설명 |
|---|---|---|
| 기본/보조 | Primary Index | 기본키에 자동 생성되는 인덱스 |
| Secondary Index | 다른 컬럼에 수동 생성하는 인덱스 | |
| 유일성 | Unique Index | 중복을 허용하지 않는 인덱스 |
| 복합성 | Composite Index | 여러 컬럼을 조합한 인덱스 |
| 구조 | B-Tree Index | 가장 일반적인 균형 트리 |
| Bitmap Index | 0/1 비트맵으로 다중값 표현 (분포도 낮은 경우 유리) | |
| Hash Index | 해시 함수 기반 (정확한 값 검색에 적합) | |
| 파티션 | Local/Global Index | 파티셔닝 테이블에 적용되는 특수 인덱스 |
| 함수형 | Function-Based Index | 함수 결과값에 인덱스 (예: UPPER(name)) |
| 전문검색 | Full Text Index | 텍스트 기반 검색 최적화 (LIKE, CONTAINS 등) |
복합 인덱스는 선두 컬럼 기반으로만 탐색 가능
예:
(A, B, C)인덱스는 A로 검색은 가능하지만 B만으로는 불가
| 기법 | 설명 |
|---|---|
| 인덱스 힌트 사용 | USE INDEX, FORCE INDEX 등으로 옵티마이저 유도 |
| 인덱스 리빌드 | 조각화(fragmentation) 방지를 위해 재정렬 |
| Covering Index | 인덱스 컬럼만으로 SELECT 가능한 경우 (Table Access 생략) |
| Partitioned Index | 대용량 데이터에서 파티션 기반 인덱스 |
-- 기본 인덱스 생성
CREATE INDEX idx_emp_deptno ON emp(deptno);
-- 복합 인덱스
CREATE INDEX idx_emp_name_dept ON emp(name, deptno);
-- 함수 기반 인덱스
CREATE INDEX idx_upper_name ON emp(UPPER(name));
INDEX RANGE SCAN, INDEX FULL SCAN, FULL TABLE SCAN 등을 분석인덱스는 책의 찾아보기처럼, 필요한 정보를 빨리 찾게 해주는 지도예요.
너무 많이 만들면 오히려 느려지고 복잡하니까, 똑똑하게 만들어야 해요!