티스토리 뷰

MySQL

[MySQL] Clustered Index & Non-Clustered Index

얀타호수 2025. 9. 3. 19:16

회고하는 느낌으로 기억나는 개념을 작성하고 알아보겠습니다.

 

 

Clustered Index

테이블의 데이터 자체가 인덱스 순서대로 저장되는 인덱스

핵심 특징

  • 테이블의 **프라이머리 키(PK)**에 주로 사용됨
  • 데이터 행 자체가 인덱스 구조(B-Tree 등)에 포함됨
  • 한 테이블에는 하나만 생성 가능 (데이터 순서를 결정하기 때문)

장점

  • 범위 검색(Range Query) 시 빠름 (BETWEEN, >, <)
  • 정렬(Sort) 불필요 → 쿼리 성능 향상

 

단점

  • 데이터 삽입/삭제/수정 시 데이터 이동 발생 → 비용 증가
  • 한 테이블에 하나만 가능

예시

CREATE TABLE employee (
    iD 		INT	PRIMARY KEY,  -- 기본키 = 클러스터드 인덱스
    name 	VARCHAR(50),
    dept 	VARCHAR(50)
);

 

 


Non-Clustered Index

 

테이블의 데이터와는 별도로 저장되는 인덱스

핵심 특징

인덱스는 키 값과 해당 데이터의 주소(포인터, RID)를 가짐

  • 테이블에 여러 개 생성 가능
  • 데이터 조회 시, 인덱스를 통해 데이터 위치를 찾아 가져옴

장점

  • 여러 개 생성 가능 → 조회 성능 향상
  • 데이터 수정 시 클러스터드처럼 전체 재정렬 필요 없음

단점

  • 범위 검색 시 데이터 주소를 찾아야 하므로 클러스터드보다 느릴 수 있음
  • 인덱스 자체가 별도 공간 차지

예시

CREATE NONCLUSTERED INDEX idx_Employee_Name
ON Employee(name);

 

 

 

 

비교 항목 클러스터드 인덱스 논클러스터드 인덱스
데이터 저장 인덱스 순서대로 테이블 데이터 자체 저장 별도 인덱스 구조만 존재, 데이터는 테이블에 그대로
개수 제한 1개 여러 개 가능
성능 범위 검색, 정렬 시 빠름 단일 키 검색 빠름, 범위 검색은 클러스터드보다 느림
데이터 수정 영향 삽입/삭제/업데이트 시 데이터 재정렬 필요 데이터 재정렬 없음, 인덱스만 수정
주 용도 PK, 데이터 정렬 조회 최적화, 자주 검색되는 컬럼

 

 

쉬운 예시 !! 

 

클러스터드 인덱스 = 책장 순서대로 정리된 책

  • 책장에 책이 이름 순서대로 꽂혀 있음
  • 특정 책을 찾으려면 바로 찾아서 뽑을 수 있음
  • 하지만 새 책을 넣거나 빼려면 책을 옮겨야 해서 귀찮음

논클러스터드 인덱스 = 책 목록표(색인표)를 따로 만든 경우

  • 책장은 아무렇게나 꽂혀 있어도 상관없음
  • 책 목록표(Index)가 있어서, 어떤 책이 몇 번째 선반에 있는지 알려줌
  • 책을 찾으려면 먼저 목록표에서 위치를 보고, 그 위치로 가서 책을 꺼냄
  • 새 책을 넣거나 빼도 책장 자체를 정렬할 필요 없음, 목록표만 업데이트하면 됨