Foundry
데이터베이스
중급
핵심

클러스터드 vs 논클러스터드 인덱스

리프 노드에 데이터 vs 포인터

클러스터드 vs 논클러스터드 인덱스

핵심 차이

클러스터드 인덱스는 데이터 자체가 정렬된 순서로 저장됩니다.

페이지담긴 행
Page 1ID=1, 홍길동
Page 2ID=2, 김철수
Page 3ID=3, 이영희

정렬 순서가 곧 저장 순서이므로 테이블당 하나만 둘 수 있습니다. 사전과 같습니다.

논클러스터드 인덱스는 별도 인덱스가 데이터 위치를 가리킵니다.

인덱스 항목가리키는 페이지
Page 3
Page 2
Page 1

데이터는 저장 순서 그대로 두고 인덱스만 따로 두므로 테이블당 여러 개를 만들 수 있습니다. 책 뒤 색인과 같습니다.

비교

항목클러스터드논클러스터드
개수테이블당 1개여러 개 가능
데이터 정렬물리적 정렬별도 구조
범위 검색매우 빠름상대적 느림
삽입 성능느림 (재정렬)빠름
저장 공간추가 없음인덱스 공간 필요
비유사전책 뒤 색인

실무 선택 기준

범위 검색 많은 컬럼 (날짜, 가격)
  → 클러스터드 인덱스

정확한 값 조회 (이메일, 주문번호)
  → 논클러스터드 인덱스

자주 변경되는 컬럼
  → 클러스터드 피하기 (재정렬 비용)

MySQL vs PostgreSQL

DB클러스터드 인덱스
MySQL (InnoDB)PK가 자동 클러스터드
PostgreSQL클러스터드 개념 없음 (CLUSTER 명령은 1회성)

면접 포인트

"PK를 AUTO_INCREMENT로 설정하는 이유가 뭔가요?"

InnoDB에서 PK = 클러스터드 인덱스. 순차 증가값이면 삽입 시 페이지 분할이 적어 쓰기 성능이 좋다. UUID를 PK로 쓰면 랜덤 삽입 → 페이지 분할 빈번 → 성능 저하.

면접에서 이렇게 나옵니다

Q.클러스터드 인덱스와 논클러스터드 인덱스의 차이를 설명해주세요

데이터 자체가 그 순서로 저장되는지가 다릅니다.

항목클러스터드논클러스터드
데이터 배치인덱스 순서대로 저장별도로 저장. 인덱스는 위치를 가리킨다
개수테이블당 하나여러 개
조회리프에 데이터가 있어 한 번에 끝난다인덱스에서 위치를 찾고 데이터를 또 읽는다
범위 조회매우 빠르다. 연속 저장이다상대적으로 느리다
삽입순서를 지켜야 해 비용이 있다상대적으로 가볍다

InnoDB 는 기본키가 클러스터드 인덱스이고, 보조 인덱스의 리프에는 기본키 값이 들어갑니다. 그래서 보조 인덱스로 찾은 뒤 기본키로 다시 찾는 두 단계가 됩니다.

사전과 책 뒤 색인의 차이로 비유할 수 있습니다.

흔한 실수: 클러스터드 인덱스를 "가장 빠른 인덱스"로만 답하는 것. 데이터 물리 순서를 정하는 것이라 삽입 패턴에 큰 영향을 줍니다.

Q.MySQL InnoDB에서 PK를 UUID로 설정하면 어떤 문제가 생기나요?

기본키가 클러스터드 인덱스라서 데이터가 물리적으로 그 순서로 저장됩니다. UUID 는 무작위라 삽입 위치가 매번 흩어집니다.

문제내용
페이지 분할중간에 끼워 넣어야 해서 페이지를 쪼갠다
단편화페이지에 빈 공간이 생겨 저장 공간이 늘어난다
캐시 효율 저하삽입 지점이 흩어져 버퍼 풀 적중률이 떨어진다
보조 인덱스 비대리프마다 16바이트 기본키가 들어간다. 정수의 두 배

증가하는 정수라면 항상 맨 뒤에 붙어 분할이 거의 없습니다.

UUID 를 꼭 써야 하면 두 가지 방법이 있습니다.

시간순으로 정렬되는 형식을 쓴다 (UUID v7 등)
기본키는 증가 정수로 두고 UUID 는 보조 인덱스가 있는 별도 컬럼에 둔다

흔한 실수: UUID 를 문자열로 저장하는 것. 36바이트가 되어 모든 보조 인덱스가 그만큼 커집니다. 바이너리 16바이트로 저장하는 것이 기본입니다.

Q.테이블에 클러스터드 인덱스가 1개만 가능한 이유는?

클러스터드 인덱스는 데이터의 물리적 저장 순서 자체이기 때문입니다. 한 데이터를 두 순서로 동시에 저장할 수 없습니다.

이름 순으로 저장하면서 동시에 날짜 순으로 저장할 수는 없다

논클러스터드 인덱스는 데이터를 그대로 두고 위치만 가리키는 별도 구조라 여러 개를 만들 수 있습니다. 책 본문은 그대로 두고 색인을 주제별, 인명별로 여러 벌 만드는 것과 같습니다.

InnoDB 는 기본키를 클러스터드로 씁니다. 기본키를 지정하지 않으면 유일 인덱스를 쓰고, 그것도 없으면 내부 숨은 컬럼을 만듭니다.

흔한 실수: 클러스터드가 없는 테이블이 가능하다고 답하는 것. 엔진에 따라 다르며 InnoDB 는 항상 하나를 갖습니다. SQL Server 는 힙 테이블로 둘 수 있습니다.

먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.

읽었으면 문제로 확인해보세요

데이터베이스 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.