Clustered Index

데이터 자체가 인덱스 순서대로 정렬되어 저장되는 인덱스입니다. 인덱스의 리프 노드가 곧 실제 데이터 페이지입니다.


구조

[클러스터드 인덱스]

       [50]
      /    \
   [20]    [70]
   리프 노드 = 실제 데이터
   ┌────────────────┐
   │ 10 | 영희 | 25 │
   │ 20 | 민수 | 30 │
   │ 30 | 철수 | 28 │
   │ 50 | 지연 | 22 │
   │ 70 | 수빈 | 31 │
   └────────────────┘

→ 인덱스를 찾으면 데이터가 바로 거기 있음 (포인터로 점프 X).


특징

항목설명
개수테이블당 1개만 가능
기준MySQL InnoDB는 PK가 자동으로 클러스터드
조회 속도매우 빠름 (인덱스 도달 = 데이터 도달)
정렬 비용INSERT 시 정렬 위치에 삽입 → 비용 ↑

Non-Clustered Index와 차이

구분ClusteredNon-Clustered
데이터 위치인덱스 리프 = 데이터인덱스 리프 = 데이터 포인터
개수1개여러 개
조회1번 점프2번 점프 (인덱스 → 데이터)

InnoDB의 동작

PK가 없으면?

  1. UNIQUE NOT NULL 컬럼이 있으면 그것을 클러스터드 인덱스로 사용
  2. 없으면 Hidden Clustered Index를 내부적으로 자동 생성

→ PK는 가능하면 명시적으로 만드는 것이 좋습니다.


왜 PK가 짧을수록 좋은가

논클러스터드 인덱스의 리프는 PK 값을 저장합니다.

논클러스터드 인덱스(name) 리프:
[철수 → PK=3] [영희 → PK=1] [지연 → PK=4]

PK가 길면 모든 보조 인덱스가 커짐 → 디스크 사용량 ↑, 캐시 효율 ↓.

CSLOG에서 보기