들어가며
면접관님께서 최근에 어떤 것을 공부하고 있느냐고 해서, 자신있게 Real MySQL을 읽으며 데이터베이스에 대해서 공부하고 있다고 말씀드렸습니다. 그러자 클러스터링 인덱스와 비 클러스터링 인덱스에 대해서 아는지, 비교를 해달라고 하셨습니다. 해당 말씀을 듣고 저는 단일 컬럼 인덱스와 복합 컬럼 인덱스로 착각하여 말씀드리게 되었습니다. 면접관님께서는 그냥 넘어가셨지만, 면접 직후 바로 찾아보니 답변을 잘못했다는 것을 알게되고 글을 기록하며 다시 한번 기억에 남기고자 글을 작성합니다!
클러스터링 인덱스란?
클러스터링이란 테이블의 레코드를 비슷한 것으로 묶어서 저장하는 것을 의미합니다. 이는 MySQL에서는 InnoDB 스토리지 엔진에서만 지원합니다.
클러스터링 인덱스는 프라이머리 키에 대해서만 적용되는 내용으로, 프라이머리 키 값이 비슷한 레코드끼리 묶어서 저장하는 것을 클러스터링 인덱스라고 표현합니다.
여기서 중요한 점은 프라이머리 키 값에 의해 레코드의 저장 위치가 결정된다는 것입니다. 즉, 만약 프라이머리 키 값이 변경된다면 레코드가 저장된 물리적인 위치가 변경되게 되며, 이는 디스크에서 데이터가 저장된 위치가 변경된다는 것을 의미합니다.
이는 아래와 같은 의미를 가질 수 있습니다.

현재 테이블은 emp\_no 컬럼이 PK(클러스터링 인덱스)이며, 데이터 저장 구조를 보면 PK 값이 연속된 형태로 데이터가 저장되어 있습니다. 만약, emp\_no 의 값이 100007인 행의 emp_no를 100002으로 변경한다면 다음과 같이 변경되게 될 것입니다.

이렇게 모든 데이터의 저장은 클러스터링 인덱스를 기준으로 정렬된 방식으로 저장되게 됩니다.
그렇다면, 이는 어떠한 장점을 지니고 있을까?
클러스터링 인덱스 장점
프라이머리 키로 검색할 때 처리 성능이 매우 빠르게 됩니다. 예시로 클러스터링 인덱스 기반으로 범위 검색을 하는 경우, 페이지를 읽을 때마다 이미 데이터가 물리적으로 정렬이 되어있기 때문에 디스크 탐색 시간을 최소화할 수 있습니다. 예를 들어 emp\_no를 기준으로 100001 ~ 100005까지 범위를 조회할때 물리적으로 데이터가 순차적으로 저장되어 있기 때문에 디스크 탐색 시간이 줄어들게 됩니다.
만약, 랜덤 위치에 저장이 되어있다면 각각 데이터를 찾을 때마다 서로 다른 위치의 데이터를 읽어야 하기 때문에 탐색 시간이 늘어나 결과적으로는 조회 시간이 길어지게 될 것입니다!
클러스터링 인덱스 단점
그렇다면, 예측한대로 단점은 PK(클러스터링 인덱스)가 변경될 때마다 물리적인 데이터의 위치 또한 변경되므로 쓰기, 변경, 삭제 등의 작업에서 속도의 지연이 있을 것입니다. 하지만 대부분의 서비스에서는 조회의 비율이 굉장히 높기 때문에 이를 감수할 수 있을 것 같습니다.
클러스터링 인덱스와 논-클러스터링 인덱스(일반 인덱스)
만약, 일반 인덱스가 실제 레코드가 저장된 주소를 값으로 가지고 있다면 클러스터링 인덱스가 변경될 때마다 물리적인 주소가 변하므로, 인덱스 또한 가지고 있는 레코드의 주소 또한 변경해주어야 할 것입니다. 그렇기 때문에 이를 위해 논-클러스터링 인덱스는 PK 값을 저장하도록 구현이 되어있습니다. 물론 이러한 단점으로는 논-클러스터링 인덱스에 접근한 뒤, 다시 PK에 접근해야 하는 단점이 존재합니다.
마치며.
면접에서 왜 글처럼 얘기를 못했을까... 분명 읽고 이해했는데... 다음에는 꼭 말하길...
참고 : Real MySQL 8.0 1권
'Back-End > DB' 카테고리의 다른 글
| 존재하지 않은 데이터에 대한 잠금의 영향 (2) | 2025.06.15 |
|---|---|
| [DB] 인덱스와 잠금 (0) | 2025.06.02 |
| [DB] 조인 종류 살펴보기 (중첩 루프 조인 & 정렬 병합 조인 & 해시 조인) (0) | 2025.04.28 |
| [DB] 인덱스 B-Tree 살펴보기! (0) | 2025.04.07 |
| [DB] 행 단위 잠금에 대한 생각 정리. (0) | 2025.02.14 |
댓글