Clustered Index
데이터 자체가 인덱스 순서대로 정렬되어 저장되는 인덱스입니다. 인덱스의 리프 노드가 곧 실제 데이터 페이지입니다.
구조
[클러스터드 인덱스]
[50]
/ \
[20] [70]
리프 노드 = 실제 데이터
┌────────────────┐
│ 10 | 영희 | 25 │
│ 20 | 민수 | 30 │
│ 30 | 철수 | 28 │
│ 50 | 지연 | 22 │
│ 70 | 수빈 | 31 │
└────────────────┘
→ 인덱스를 찾으면 데이터가 바로 거기 있음 (포인터로 점프 X).
특징
| 항목 | 설명 |
|---|---|
| 개수 | 테이블당 1개만 가능 |
| 기준 | MySQL InnoDB는 PK가 자동으로 클러스터드 |
| 조회 속도 | 매우 빠름 (인덱스 도달 = 데이터 도달) |
| 정렬 비용 | INSERT 시 정렬 위치에 삽입 → 비용 ↑ |
Non-Clustered Index와 차이
| 구분 | Clustered | Non-Clustered |
|---|---|---|
| 데이터 위치 | 인덱스 리프 = 데이터 | 인덱스 리프 = 데이터 포인터 |
| 개수 | 1개 | 여러 개 |
| 조회 | 1번 점프 | 2번 점프 (인덱스 → 데이터) |
InnoDB의 동작
PK가 없으면?
- UNIQUE NOT NULL 컬럼이 있으면 그것을 클러스터드 인덱스로 사용
- 없으면 Hidden Clustered Index를 내부적으로 자동 생성
→ PK는 가능하면 명시적으로 만드는 것이 좋습니다.
왜 PK가 짧을수록 좋은가
논클러스터드 인덱스의 리프는 PK 값을 저장합니다.
논클러스터드 인덱스(name) 리프:
[철수 → PK=3] [영희 → PK=1] [지연 → PK=4]
PK가 길면 모든 보조 인덱스가 커짐 → 디스크 사용량 ↑, 캐시 효율 ↓.