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)가 있어서, 어떤 책이 몇 번째 선반에 있는지 알려줌
- 책을 찾으려면 먼저 목록표에서 위치를 보고, 그 위치로 가서 책을 꺼냄
- 새 책을 넣거나 빼도 책장 자체를 정렬할 필요 없음, 목록표만 업데이트하면 됨