클러스터드 vs 논클러스터드 인덱스
핵심 차이
클러스터드 인덱스는 데이터 자체가 정렬된 순서로 저장됩니다.
| 페이지 | 담긴 행 |
|---|---|
| Page 1 | ID=1, 홍길동 |
| Page 2 | ID=2, 김철수 |
| Page 3 | ID=3, 이영희 |
정렬 순서가 곧 저장 순서이므로 테이블당 하나만 둘 수 있습니다. 사전과 같습니다.
논클러스터드 인덱스는 별도 인덱스가 데이터 위치를 가리킵니다.
| 인덱스 항목 | 가리키는 페이지 |
|---|---|
| 김 | Page 3 |
| 이 | Page 2 |
| 홍 | Page 1 |
데이터는 저장 순서 그대로 두고 인덱스만 따로 두므로 테이블당 여러 개를 만들 수 있습니다. 책 뒤 색인과 같습니다.
비교
| 항목 | 클러스터드 | 논클러스터드 |
|---|---|---|
| 개수 | 테이블당 1개 | 여러 개 가능 |
| 데이터 정렬 | 물리적 정렬 | 별도 구조 |
| 범위 검색 | 매우 빠름 | 상대적 느림 |
| 삽입 성능 | 느림 (재정렬) | 빠름 |
| 저장 공간 | 추가 없음 | 인덱스 공간 필요 |
| 비유 | 사전 | 책 뒤 색인 |
실무 선택 기준
범위 검색 많은 컬럼 (날짜, 가격)
→ 클러스터드 인덱스
정확한 값 조회 (이메일, 주문번호)
→ 논클러스터드 인덱스
자주 변경되는 컬럼
→ 클러스터드 피하기 (재정렬 비용)
MySQL vs PostgreSQL
| DB | 클러스터드 인덱스 |
|---|---|
| MySQL (InnoDB) | PK가 자동 클러스터드 |
| PostgreSQL | 클러스터드 개념 없음 (CLUSTER 명령은 1회성) |
면접 포인트
"PK를 AUTO_INCREMENT로 설정하는 이유가 뭔가요?"
InnoDB에서 PK = 클러스터드 인덱스. 순차 증가값이면 삽입 시 페이지 분할이 적어 쓰기 성능이 좋다. UUID를 PK로 쓰면 랜덤 삽입 → 페이지 분할 빈번 → 성능 저하.