Appearance
Clustered Index vs Non-Clustered Index
데이터베이스 테이블에서 검색 속도를 높이기 위해 사용하는 인덱스(Index)의 두 가지 주요 구현 방식.
1. Clustered Index (클러스터형 인덱스)
"책의 페이지 자체(데이터)가 목차 순서대로 정렬되어 있는 상태 (예: 국어사전)"
- 물리적 정렬: 인덱스의 키 값에 따라 테이블의 실제 데이터 행(Row)이 물리적으로 정렬되어 저장된다.
- 개수 제한: 테이블의 데이터는 한 가지 기준으로만 정렬될 수 있으므로, 테이블당 1개만 생성 가능하다. (보통 Primary Key에 자동 생성됨)
- 검색 속도: 리프 노드(Leaf Node)가 곧 실제 데이터 페이지이므로, 데이터 접근(Read) 속도가 매우 빠르다.
- 수정 속도: 데이터가 삽입/수정될 때마다 물리적 정렬을 유지해야 하므로, 쓰기(Write) 작업 시 오버헤드가 크고 페이지 분할(Page Split)이 발생할 수 있다.
2. Non-Clustered Index (논클러스터형 인덱스)
"책의 맨 뒤에 있는 찾아보기(색인). 단어와 그 단어가 있는 페이지 번호가 따로 분리되어 있는 상태"
- 물리적 정렬 안 함: 실제 데이터 행의 배열 순서와 무관하게 인덱스(목차)만 별도의 공간에 생성된다. 데이터 자체는 정렬되지 않는다.
- 개수 제한: 테이블당 여러 개 생성 가능하다. (테이블에 따라 제한 개수는 다름)
- 구조: 리프 노드에는 실제 데이터가 아닌, 데이터가 위치한 **주소 값(RID 또는 클러스터형 인덱스 키)**이 저장되어 있다.
- 검색/수정 속도: 데이터에 접근하려면 인덱스를 거쳐 주소 값으로 찾아가야 하므로(Book Mark Lookup), Clustered Index보다 읽기 속도는 약간 느리다. 하지만 데이터 정렬을 유지할 필요가 없어 쓰기/수정 성능에 미치는 악영향은 상대적으로 적다.
요약 비교
| 특징 | Clustered Index | Non-Clustered Index |
|---|---|---|
| 물리적 데이터 정렬 | O (정렬됨) | X (정렬 안 됨) |
| 테이블 당 개수 | 1개 | 여러 개 (제한적) |
| 리프 노드의 구성 | 실제 데이터 페이지 | 데이터의 위치 주소 (Pointer) |
| 검색 속도 (Read) | 매우 빠름 | 빠름 (상대적으로 약간 느림) |
| 수정 속도 (Write) | 느림 (정렬 오버헤드 큼) | 상대적으로 빠름 |
| 주 사용처 | Primary Key, 범위 검색(BETWEEN, <, >) | JOIN, WHERE 절에 자주 쓰이는 컬럼 |