Clustered Index (클러스터형 인덱스)
유일성과 최소성을 가지는 기본키 중 하나로 설정됩니다. 테이블당 한 개만 생성 가능하며, 보통 테이블의 기본키가 클러스터형 인덱스가 됩니다.
내부 구조
Clustered Index 구조:
인덱스 페이지
↓
리프 노드 = 실제 데이터 페이지
[10][25][50][75][100] ← 인덱스
↓ ↓ ↓ ↓ ↓
실제 데이터가 정렬되어 저장됨
데이터 페이지가 정렬되어 저장되며 인덱스 페이지의 리프 노드에 "데이터 페이지"가 들어가 있습니다.
장점
- 탐색 성능 우수: 데이터가 정렬되어 있어 범위 검색에 유리
- 추가 포인터 불필요: 리프 노드가 실제 데이터
단점
데이터가 추가될 때마다 다시 모든 테이블을 정렬해야 하기 때문에 삽입, 삭제, 수정이 느립니다.
-- Clustered Index 생성 (기본키)
CREATE TABLE users (
user_id INT PRIMARY KEY, -- 자동으로 Clustered Index
username VARCHAR(50),
email VARCHAR(100)
);
Non-Clustered Index (비클러스터형 인덱스)
보조 인덱스라고 합니다. 한 개가 아닌 여러 개를 만들 수 있습니다. 클러스터형 키가 복합키가 될 수도 있지만, 보통 복합키를 만든다고 했을 때 보조 인덱스로 만듭니다.
내부 구조
Non-Clustered Index 구조:
인덱스 페이지
↓
리프 노드 = 데이터 포인터
[email1][email2][email3] ← 인덱스 (정렬됨)
↓ ↓ ↓
포인터 → 실제 데이터 위치 (정렬 안 됨)
클러스터형과는 달리 인덱스 페이지 리프 노드에 실제 데이터가 있는 것이 아니라 데이터 페이지에 관한 포인터가 있습니다.
장점
- 삽입, 삭제, 수정이 빠름: 데이터 재정렬 불필요
- 여러 개 생성 가능: 다양한 검색 조건 지원
단점
- 탐색이 느림: 정렬되어 있지 않아서 추가 포인터 참조 필요
- 인덱스의 순서와 데이터의 순서가 일치하지 않음
-- Non-Clustered Index 생성
CREATE INDEX idx_email ON users(email);
CREATE INDEX idx_username ON users(username);
-- 여러 개 생성 가능
Clustered vs Non-Clustered 비교
| 특성 | Clustered Index | Non-Clustered Index |
| 테이블당 개수 | 1개만 | 여러 개 |
| 데이터 정렬 | 물리적으로 정렬 | 정렬 안 됨 |
| 리프 노드 | 실제 데이터 | 데이터 포인터 |
| 인덱스-데이터 순서 | 일치 | 불일치 |
성능 비교
| 작업 | Clustered Index | Non-Clustered Index |
| 검색 (범위) | 빠름 ⚡⚡⚡ | 보통 ⚡⚡ |
| 검색 (단일) | 빠름 ⚡⚡⚡ | 빠름 ⚡⚡ |
| 삽입 | 느림 🐌 | 빠름 ⚡ |
| 삭제 | 느림 🐌 | 빠름 ⚡ |
| 수정 | 느림 🐌 | 빠름 ⚡ |
실제 동작 비교
Clustered Index 검색
SELECT * FROM users WHERE user_id = 100;
실행 과정:
1. Clustered Index 트리 탐색
2. 리프 노드 도달 = 실제 데이터 발견
3. 즉시 반환 (2단계)
Non-Clustered Index 검색
SELECT * FROM users WHERE email = 'test@example.com';
실행 과정:
1. Non-Clustered Index 트리 탐색
2. 리프 노드에서 데이터 위치(포인터) 획득
3. 포인터를 따라 실제 데이터 페이지 접근
4. 데이터 반환 (3단계)
인덱스 선택 기준
Clustered Index 권장
- 기본키: 대부분 자동 설정
- 범위 검색이 많은 컬럼: 날짜, 순차 ID 등
- 읽기 중심 테이블: 삽입/수정이 적은 경우
Non-Clustered Index 권장
- 검색 조건이 다양한 경우: 여러 컬럼 검색
- 쓰기 작업이 빈번한 테이블: 삽입/수정/삭제가 많은 경우
- 복합 인덱스: 여러 컬럼 조합 검색
'ZeroBase > CS' 카테고리의 다른 글
| 데이터베이스 데드락 - 발생 조건과 해결 방법 (0) | 2025.10.12 |
|---|---|
| 데이터베이스 정규화 - 이상 현상 해결과 정규형 (0) | 2025.10.12 |
| 데이터베이스 인덱스 - B-Tree와 성능 최적화 (0) | 2025.09.30 |
| 트랜잭션 격리 수준과 발생 가능한 현상 (0) | 2025.09.30 |
| 데이터베이스 트랜잭션 - ACID와 무결성 (0) | 2025.09.28 |