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 재탐색

조회 흐름:

  1. Non-Clustered Index에서 PK 찾기
  2. 그 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 = '철수';

→ 자주 함께 조회되는 컬럼을 복합 인덱스로 묶으면 성능 ↑.

CSLOG에서 보기