Non-Clustered Index
인덱스와 실제 데이터가 분리되어 있고, 인덱스 리프 노드가 데이터의 위치(포인터)를 가지는 인덱스입니다. 보조 인덱스(Secondary Index)라고도 불립니다.
구조
[논클러스터드 인덱스]
인덱스 (정렬됨) 실제 테이블 (삽입 순)
┌─────────────┐ ┌────────────────┐
│ 민수 → row2 │ ──────────▶ │ 1 영희 25 │
│ 영희 → row1 │ ──────────▶ │ 2 민수 30 │
│ 지연 → row4 │ ──────────▶ │ 3 철수 28 │
│ 철수 → row3 │ ──────────▶ │ 4 지연 22 │
└─────────────┘ └────────────────┘
→ 인덱스 도달 후 포인터를 따라 한 번 더 점프해야 데이터에 도달.
특징
| 항목 | 설명 |
|---|---|
| 개수 | 테이블당 여러 개 가능 |
| 생성 | 일반 CREATE INDEX로 만들어지는 것 대부분 |
| 조회 | 2단계 (인덱스 탐색 → 실제 데이터 fetch) |
| 저장 공간 | 별도 인덱스 페이지 필요 |
InnoDB에서의 특수성
InnoDB의 논클러스터드 인덱스는 데이터 위치 대신 PK 값을 저장합니다.
인덱스(name) → PK
[철수 → 3] → PK=3로 Clustered Index 재탐색
[영희 → 1] → PK=1로 Clustered Index 재탐색
조회 흐름:
- Non-Clustered Index에서 PK 찾기
- 그 PK로 Clustered Index 재탐색 → 데이터 도달
→ 2번의 B-Tree 탐색이 일어남 (이를 "북마크 룩업" 또는 "보조 인덱스 룩업"이라 함).
Covering Index
논클러스터드 인덱스만으로 쿼리를 끝낼 수 있는 경우 → 두 번째 점프 생략.
CREATE INDEX idx_name_age ON users(name, age);
-- 인덱스만 봐도 답이 나옴 (테이블 접근 X)
SELECT name, age FROM users WHERE name = '철수';
→ 자주 함께 조회되는 컬럼을 복합 인덱스로 묶으면 성능 ↑.