ZeroBase/CS

Clustered Index vs Non-Clustered Index

Red_Horse 2025. 9. 30. 16:10

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 권장

  • 검색 조건이 다양한 경우: 여러 컬럼 검색
  • 쓰기 작업이 빈번한 테이블: 삽입/수정/삭제가 많은 경우
  • 복합 인덱스: 여러 컬럼 조합 검색