728x90
반응형
SMALL
1) 인덱스란?
- 테이블을 전부 훑지 않고(Full Scan 회피), 조건/정렬/조인을 빠르게 하기 위한 보조 구조.
- 핵심 아이디어: 키(key) → 레코드 위치 매핑을 `정렬된/조직된 구조에 저장.
- 구조를 정의하므로 CREATE/DROP 을 사용
2) 주요 유형
(1) B+Tree 인덱스 (가장 일반적)
- 정렬된 트리. 범위 조회, 정렬, ORDER BY, BETWEEN, >, <, LIKE 'abc%'에 강함.
- 대부분 RDB의 기본(Oracle, MySQL/InnoDB, PostgreSQL 등).
(2) 해시(Hash) 인덱스
- 동등 비교(=) 전용으로 매우 빠름. 범위/정렬에는 부적합.
- 엔진별 지원/제약 상이(예: MySQL Memory/Hash, PostgreSQL hash index 등).
(3) 비트맵(Bitmap) 인덱스
- 저카디널리티(값 종류가 적은) 컬럼에 강함(예: 성별, 상태코드).
- DW/OLAP에서 유리. 트랜잭션 쓰기 많은 OLTP엔 비추천(락 범위 큼).
(4) 클러스터드 / 넌클러스터드
- 클러스터드(Clustered): 테이블 물리 순서 = 인덱스 순서(InnoDB의 PK가 이에 해당). 한 테이블 하나만.
- 넌클러스터드(Nonclustered): 별도 보조 구조. 여러 개 만들 수 있음.
(5) 유니크/복합/커버링/부분/함수 인덱스
- UNIQUE: 키 중복 금지(무결성 + 탐색 빠름).
- 복합(Composite): (col1, col2, …). 왼쪽 접두사(Leftmost) 규칙 중요.
- 커버링(Covering): 쿼리에 필요한 컬럼이 전부 인덱스에 존재 → 테이블 접근 없이 Index-Only Scan.
- (SQL Server/PG) INCLUDE (col3, col4) 로 비키 컬럼 포함 가능.
- 부분/필터드(Partial/Filtered): 조건 만족 행만 인덱싱 → 크기↓, 효율↑
- (PG) CREATE INDEX ... ON t(col) WHERE status='ACTIVE';
- 함수/표현식(Functional/Expression): LOWER(name), date_trunc(...) 등 표현식 기반 인덱스.
(6) 전문(Full-Text) / 공간(Spatial) / 특수
- Full-Text: 텍스트 검색(토큰/랭킹).
- GIN/GiST(PostgreSQL): 배열 포함, JSONB 키, 근접/공간 질의 등.
3) 언제 효과적인가? (SARGABLE 조건)
- =, >, <, BETWEEN, IN, LIKE 'abc%' (접두사)
- 조인 키, 정렬/그룹 키(정렬 스킵/Using Index 가능)
- 선택도(Selectivity) 높은 컬럼(값 분포가 넓은 컬럼)
비효율 케이스: WHERE func(col)=..., LIKE '%abc', 형변환 후 비교, 널리 쓰이는 저카디널리티 컬럼(=값이 몇 개 안 됨)
4) 성능과 부작용
- 읽기 성능↑ vs 쓰기 비용↑: 인덱스가 많을수록 DML(INSERT/UPDATE/DELETE) 느려짐.
- 공간 사용: 인덱스도 디스크/메모리 차지.
- 통계/분포: 옵티마이저는 히스토그램/통계로 계획 결정 → ANALYZE/UPDATE STATISTICS 중요.
- 프래그멘테이션: 대량 변경 후 리빌드/리오가나이즈 고려(엔진별).
- MVCC(예: PostgreSQL): 인덱스/테이블 블로트 발생 → VACUUM(autovacuum) 필수.
5) 예시
<student> 테이블의 name 속성을 오름차순하여 idx_name를 인덱스명으로 하는 인덱스를 생성
CREATE INDEX // index 만들기
idx_name // 인덱스명
ON student // 기준 테이블
(name asc) // 조건 설정
CREATE INDEX idx_name ON student(name asc)728x90
반응형
LIST