CS
[Database] 클러스터 인덱스와 넌클러스터 인덱스
자바바
2024. 5. 18. 20:37
인덱스
인덱스는 데이터 레코드를 빠르게 접근하기 위해서 <키, 포인터> 쌍으로 구성되는 데이터 구조다.
<PK값, 데이터 row의 주소> 형태로 자료구조로 묶어서 저장한다. 따라서, DB의 테이블에 데이터가 많을 때, 검색 속도를 향상시켜주기 위해 사용한다.

하지만, 인덱스를 생성하면 무조건 데이터를 빠르게 검색할 수 있을까? 아니다. 인덱스를 무작정 생성한다고 좋은 방법은 아니다.
인덱스를 생성하면 인덱스를 위한 디스크 공간이 필요하고, 인덱스를 가진 테이블에 DML(데이터 조작 명령어. 예) INSERT, DELETE, UPDATE) 작업을 할 경우 더 많은 비용과 시간이 필요하다. 때문에 인덱스를 생성 시 해당 테이블의 의도를 정확히 파악 후 상황에 맞게 Clustered Index와 Non Clustered Index를 구성해야 한다.
클러스터 인덱스(Clustered Index)
- 테이블당 1개씩만 허용된다.
- 물리적으로 행을 재배열한다.
- 테이블 생성 시 PK를 지정하면, 그 칼럼은 자동으로 클러스터드 인덱스가 만들어진다.
- 테이블당 단 하나의 Clustered Index만 존재할 수 있다.
- 데이터 입력, 수정, 삭제 시 항상 정렬 상태 유지한다.
- 넌 클러스터 인덱스보다 검색 속도는 빠르다. 하지만 데이터의 입력, 수정, 삭제는 느리다.
언제 생성해야 할까?
- 테이블 데이터가 자주 업데이트되지 않을 경우
- MAX, MIN, COUNT 등의 쿼리로 범위 또는 Group By 등의 조회를 하는 경우. 즉, 특정 범위 내 검색을 할 경우
- 항상 정렬된 방식으로 데이터를 반환해야하는 경우
- 읽기 작업이 월등히 많은 경우
단점
- 리프 페이지가 모두 차있는데 새로운 데이터가 추가될 때 페이지 분할이 일어난다.
- 항상 순서를 유지해야 한다.
- 테이블에서 데이터 조작이 빈번할 경우 성능 저하 발생.
넌클러스터 인덱스(Non Clustered Index)
- 넌클러스터드 인덱스는 별도의 인덱스 구조를 가지며, 테이블의 데이터와는 별도로 저장된다. (레코드의 원본 데이터 페이지는 건드리지 않고, 별도의 인덱스 페이지를 생성한다. -> 용량 더 차지)
- 인덱스 엔트리는 실제 데이터 행을 가리키는 포인터를 포함한다. 즉, 인덱스에서 키 값을 찾은 후, 이 키가 가리키는 위치로 이동하여 데이터를 조회한다.
- 한 테이블에 여러 개의 넌클러스터드 인덱스를 생성할 수 있다.
- 클러스터형보다 검색 속도는 빠르지만, 데이터의 입력, 수정, 삭제는 더 빠르다.
- 클러스터드 인덱스보다 데이터 수정 시 성능 저하가 덜하다. -> 인덱스 구조가 데이터와 분리되어 있기 때문
언제 사용하나?
- where절이나 Join절과 같이 조건문을 활용하여 테이블을 필터링하고자 할 경우
- 데이터가 자주 업데이트될 경우
- 특정 컬럼이 쿼리에서 자주 사용될 경우
단점
- 클러스터드 인덱스는 테이블 정렬만 하면 되니 추가적인 저장 공간이 필요 없지만, 넌클러스터 인덱스는 인덱스 페이지만을 위한 추가 저장공간이 필요하다. -> 데이터 삽입, 삭제, 수정 시, 넌클러스 인덱스는 별도의 공간에 인덱스를 생성함
- 데이터 접근 속도가 클러스터 인덱스보다 상대적으로 느림. -> 특정 데이터 행에 접근하려면인덱스 조회 후 추가적인 데이터 읽어야 하기 때문
- 인덱스 조회 시 비용이 많이 발생한다. -> 검색하고자 하는 데이터 키 값을 루트 페이지에서 비교하여 리프 페이지 번호 찾고, 리프 페이지에서 RID 정보로 실제 데이터 위치로 이동
- 삽입, 삭제, 업데이트 시 여러 인덱스를 갱신해야 하기 때문에 인덱스가 많아질수록 인덱스 유지 관리에 오버헤드가 발생할 수 있음.
요약
Clustered Index | Non Clustered Index |
리프 테이블 자체가 인덱스 | 테이블과 별개로 인텍스 존재 |
실제 데이터 정렬 | 실제 데이터 정렬 X |
테이블당 1개만 존재 | 테이블당 여러개 존재 가능 |
검색 속도에 우위 | 데이터 변경 속도에 우위 |
클러스터 인덱스는 데이터 위치를 바로 알기 때문에 그 데이터에 바로 접근하기 때문에 접근 속도가 빠른 것이고, 넌 클러스터 인덱스는 인덱스 페이지를 한번 거쳐서 데이터에 접근하는 것이다.
책으로 비유하자면, 클러스터 인덱스는 페이지를 알기 때문에 바로 그 페이지를 펴는 것이고, 넌 클러스터 인덱스는 뒤에 목차에서 찾고자 하는 내용의 페이지를 찾고, 그 페이지로 이동하는 것과 같다.