1. 데이터베이스의 인덱스란?
DB 인덱스는 데이터베이스의 색인 기능입니다. 데이터베이스의 모든 데이터 행을 처음부터 끝까지 확인하지 않고, 원하는 데이터 위치를 미리 정렬된 자료구조를 통해 빠르게 검색 할 수 있도록 돕는 기술입니다.
- 장점:
SELECT조회 속도 향상,ORDER BY정렬 및JOIN연산 효율 증가 - 단점: 추가 저장 공간 필요하고,
INSERT/UPDATE/DELETE작업 시 인덱스 재정렬 오버헤드 발생
2. 인덱스의 구조
대부분의 RDBMS는 인덱스를 B-Tree 자료구조로 관리합니다.
- Root / Branch Node: 하위 노드의 주소값을 가리키며 탐색 경로 제공
- Leaf Node: 실제 데이터의 주소(RID 또는 Primary Key)를 보유
데이터 탐색 시 루트 노드부터 시작해 조건값을 비교하며 아래로 내려가므로, 데이터 양이 크게 늘어나도 탐색 속도를 일정 수준으로 유지할 수 있습니다.
3. Clustered vs Non-Clustered Index
| 구분 | 클러스터드 인덱스 (Clustered) | 논클러스터드 인덱스 (Non-Clustered) |
| 생성 시점 | Primary Key 지정 시 자동 생성 |
직접 CREATE INDEX로 추가
|
| 개수 제한 | 테이블당 1개만 존재 가능 | 테이블당 여러 개 생성 가능 |
| 데이터 정렬 | 실제 데이터 자체가 PK 순서로 물리적 정렬 | 데이터는 그대로 두고 별도 인덱스 페이지 생성 |
| 비유 | 사전 (단어 순서대로 내용이 나열됨) | 일반 서적의 맨 뒤 '색인' |
4. 인덱스는 어떻게 사용할까?
어떤 컬럼에 걸어야 할까?
- 카디널리티가 높은 컬럼: 중복도가 낮고 유일한 값이 많은 컬럼 (예: 이메일, 주민번호 > 성별, 학년)
- 검색 조건 컬럼:
WHERE,JOIN,ORDER BY절에 자주 사용되는 컬럼 - CUD 변경이 적은 컬럼: 데이터 수정이 빈번하면 인덱스 재정렬 비용이 커집니다.
복합 인덱스 생성 시 컬럼 순서
- 여러 컬럼을 묶어 인덱스를 만들 때는 카디널리티가 높고 자주 조회 조건에 오는 컬럼을 가장 앞에 배치해야 인덱스 효과를 극대화할 수 있습니다.
5. 인덱스를 타지 않는 상황
쿼리를 작성하더라도 아래의 경우에는 인덱스를 활용하지 못하고 Full Table Scan을 실행하게 됩니다.
- 인덱스 컬럼을 가공/변형하는 경우
- ❌
WHERE YEAR(created_at) = 2026 - ⭕
WHERE created_at >= '2026-01-01' AND created_at < '2027-01-01'
- ❌
- 와일드카드(
%)를 앞에 사용하는 경우- ❌
WHERE name LIKE '%길동'(앞부분을 알 수 없어 전체 스캔) - ⭕
WHERE name LIKE '홍길%'
- ❌
- 묵시적 타입 변환이 발생하는 경우
- 문자열 컬럼에 숫자 검색 시 DB 내부적으로 타입 변환이 일어나 인덱스가 미적용될 수 있습니다.
