Development/CS

클러스터 인덱스(Clustered Index)와 넌클러스터 인덱스(Non-Clustered Index)

lovetan 2025. 1. 24. 21:50

클러스터 인덱스(Clustered Index)

실제 데이터가 저장되는 물리적 순서를 결정하는 인덱스이다. 

마치 도서관에서 책을 도서번호순으로 실제로 배열하는 것과 같다. 테이블당 단 하나만 가질 수 있으며, 보통 프라이머리 키(PK)가 클러스터 인덱스가 된다.

클러스터 인덱스 구조

 

✅ 사용되는 예시: "StudentID가 2인 학생을 찾아라"

  • 클러스터 인덱스를 통해 바로 해당 위치로 이동이 가능하다.
  • 매우 빠른 검색이 가능하다.
CREATE TABLE Students (
    StudentID INT PRIMARY KEY,  -- 클러스터 인덱스가 됨
    Name VARCHAR(50),
    Grade INT
);

넌클러스터 인덱스(Non-Clustered Index)

 

실제 데이터의 물리적 순서와는 무관하며, 별도의 공간에 정렬된 인덱스를 저장한다.

도서관의 카드 목록처럼, 원하는 책의 위치를 찾을 수 있는 참조 정보만을 담고 있다. 테이블당 여러 개를 가질 수 있다. 

넌클러스터 인덱스 구조

 

✅ 사용되는 예시: "이름이 '박민준'인 학생을 찾아라"

  • Name 넌클러스터 인덱스에서 '박민준'을 찾는다.
  • 해당하는 StudentID(3)를 확인한다.
  • 그 StudentID를 사용해 실제 데이터에 접근한다. 

✅ 사용되는 예시2: "3학년 학생들을 모두 찾아라"

  • Grade 넌클러스 인덱스에서 Grade 3을 찾는다.
  • 해당하는 StudentID {1,4}를 확인한다.
  • 각 StudentID로 실제 데이터에 접근한다.
CREATE INDEX idx_name ON Students(Name);  -- 넌클러스터 인덱스 생성
CREATE INDEX idx_grade ON Students(Grade);  -- 추가 넌클러스터 인덱스

 


클러스터 인덱스 VS 넌클러스터 인덱스

  클러스터 인덱스 넌클러스터 인덱스
성능 - 데이터 검색이 매우 빠름
- 데이터 삽입/수정/삭제는 물리적 재정렬이 필요해 상대적으로 느림
- 검색 시 추가적인 조회 과정이 필요해 느림
- 데이터 변경이 더 용이함
저장 공간 - 데이터 자체의 순서를 정의하므로 추가 공간이 거의 필요 없음 - 별도의 인덱스 페이지가 필요해 추가 저장 공간을 사용
용도 - 자주 범위 검색을 하거나, 정렬된 경과가 필요한 열에 적합 - 특정 값을 검색하는 경우나 조인 연산에 자주 사용되는 열에 적합

 

 


# 현업에서의 넌클러스트 인덱스 사용도

  • PK외 모든 인덱스는 넌클러스터드 인덱스로 사용된다.
  • PK로만 해결되지 않는 상황 발생시, 해당 테이블에 인덱스를 생성하기도 하는데 이럴 때 생성되는 것들이 모두 넌클러스터드 인덱스이다.

 

결론적으로 넌클러스트 인덱스는 아주 자주 쓰인다.

특징을 잘 알아두고 실제로 자주 사용되는 검색 조건을 기준으로 쓰거나 하는 등.. 성능을 높일 수 있는 상황에서 사용하면 무척 유용하게 쓰일 것이다.