반응형
Clustered Index와 Non-Clustered Index는 인덱스의 물리적 구조와 저장 방식, 그리고 데이터 접근 방식에 따라 나뉩니다. 이 둘은 개념적으로 매우 중요한 차이가 있으며, 특히 SQL Server, MySQL(InnoDB)와 같은 DBMS에서 성능과 저장 구조에 큰 영향을 미칩니다.
클러스터드 인덱스(Clustered Index)의 구조와 동작 방식
클러스터드 인덱스는 인덱스가 곧 데이터 자체를 정렬하여 저장하는 구조입니다.
즉, 리프 노드(leaf node)가 인덱스가 아니라 실제 데이터 레코드입니다.
- 테이블의 데이터가 클러스터드 인덱스의 키 순서대로 정렬되어 저장됩니다.
- 하나의 테이블에는 클러스터드 인덱스는 단 하나만 존재할 수 있습니다. 왜냐하면 데이터는 한 가지 정렬 방식으로만 물리적으로 저장될 수 있기 때문입니다.
- 기본 키(Primary Key)가 있는 경우, 대부분 DBMS에서는 기본적으로 해당 컬럼에 클러스터드 인덱스를 생성합니다.
예시:
CREATE CLUSTERED INDEX idx_emp_id ON employees(emp_id);
장점:
- 범위 검색, 정렬된 출력에서 탁월한 성능을 보임
- 커버링 인덱스 없이도 조회에 필요한 데이터가 모두 존재함 (리프 노드가 곧 데이터)
단점:
- 데이터 삽입 시 정렬된 위치를 유지해야 하므로 비용이 큼
- INSERT/UPDATE로 인해 **페이지 스플릿(Page Split)**이 발생할 수 있음
넌클러스터드 인덱스(Non-Clustered Index)의 구조와 동작 방식
넌클러스터드 인덱스는 인덱스와 데이터가 분리되어 있는 구조입니다.
즉, 인덱스의 리프 노드에는 **데이터의 실제 위치(ROWID 또는 클러스터드 인덱스 키)**가 저장되어 있고, 이를 이용해 데이터에 간접적으로 접근합니다.
- 하나의 테이블에 여러 개 생성 가능합니다.
- 데이터는 물리적으로 정렬되지 않으며, 인덱스만 정렬됩니다.
예시:
CREATE NONCLUSTERED INDEX idx_emp_name ON employees(emp_name);
장점:
- 다양한 조건에 맞게 여러 인덱스를 생성 가능
- DML(삽입, 삭제, 갱신)에 대한 부담이 상대적으로 적음
단점:
- 실제 데이터를 읽기 위해 인덱스 -> 데이터 테이블의 이중 접근이 필요
- 정렬된 결과가 필요하거나 범위 조회 시 클러스터드 인덱스보다 느림
두 인덱스의 구조적 비교
항목 | Clustered Index | Non-Clustered Index |
리프 노드 | 실제 데이터 | 인덱스 키 + 데이터 위치 정보 |
데이터 정렬 | 인덱스 순서대로 테이블 데이터 정렬 | 데이터는 정렬되지 않음 |
테이블당 인덱스 개수 | 하나만 존재 가능 | 여러 개 생성 가능 |
데이터 접근 속도 | 빠름 (데이터 = 인덱스) | 느림 (추가적인 접근 필요) |
INSERT/UPDATE 성능 영향 | 정렬 유지로 인해 비용 큼 | 클러스터드 인덱스보다 영향 작음 |
범위 검색 및 ORDER BY 성능 | 우수함 | 상대적으로 성능 저하 가능 |
MySQL InnoDB와의 관계
- MySQL의 InnoDB 엔진은 기본적으로 클러스터드 인덱스를 사용합니다.
- InnoDB에서 **기본 키(Primary Key)**가 클러스터드 인덱스로 설정되며, 없다면 NOT NULL + UNIQUE 제약 조건이 있는 컬럼이 클러스터드 인덱스가 됩니다.
- 다른 보조 인덱스(Non-Clustered Index)는 클러스터드 인덱스의 키 값을 리프 노드에 포함하고 있어 인덱스 → 클러스터드 인덱스 → 실제 데이터의 구조를 가집니다.
요약
- 클러스터드 인덱스는 데이터 자체가 인덱스이며, 물리적으로 정렬된 상태로 저장됩니다. 하나의 테이블에 단 하나만 존재할 수 있습니다.
- 넌클러스터드 인덱스는 인덱스와 데이터가 분리되어 있으며, 인덱스의 리프 노드는 데이터의 위치만 가지고 있습니다.
- 범위 검색과 정렬된 결과 출력은 클러스터드 인덱스가 우수하며, 다양한 조회 조건에는 넌클러스터드 인덱스를 병행해서 사용하는 것이 일반적입니다.
- MySQL InnoDB에서는 기본 키가 클러스터드 인덱스로 작동하며, 나머지 인덱스는 내부적으로 해당 클러스터드 키를 참조합니다.
반응형
'백엔드 공부일지 > 데이터베이스 공부일지' 카테고리의 다른 글
데이터베이스 정규화: 이상현상과 함수적 종속성까지 (0) | 2025.05.13 |
---|---|
데이터베이스 인덱스 구조와 종류, 성능 최적화 기법 총정리 (0) | 2025.05.12 |
데이터베이스 트랜잭션 격리수준과 이상현상 (0) | 2025.05.11 |
트랜잭션이란? 커밋, 롤백, ACID, 격리성까지 (0) | 2025.05.11 |
SQL 조인 알고리즘 비교: Hash join (해시 조인) (0) | 2025.05.11 |