코딩관계론

클러스터링과 논클러스트링이란? 본문

개발/Java

클러스터링과 논클러스트링이란?

개발자_티모 2024. 7. 3. 21:51
반응형

클러스터링

클러스터링이랑 군집화를 의미한다. 즉 물리적인 디스트크에 어떤 기준으로 데이터들이 군집되어 있다는 것을 말하는데 PK를 기준으로 클러스터링 인덱스를 자동으로 생성됩니다.
 

이 클러스터링은 테이블당 하나만 생성됩니다. 이는 당연한 것으로 물리적으로 정렬되기 때문입니다.  또한 항상 디스크에 정렬된 상태로 존재하기 때문에 데이터의 추가, 삭제, 업데이트 시 물리적으로 정렬하는 과정을 커쳐야 하기 때문에 성능 저하의 이슈가 될 수 있습니다.
 
클러스터링의 동작 방식은 배열의 삽입 연산과 동작이 같습니다. 따라서 최악의 경우에는 O(n) 성능으로 동작하게 됩니다.
만약 UserTable에 데이터가 아래의 그림과 같이 존제하고, "aaaa@naver.com, testuser1"을 넣어야 한다면 어떻게 동작하게 될까요?

 
다음과 같이 동작을 하게 됩니다. aaaa가 들어갈 위치를 찾고, 해당 공간에 위치했던 데이터들을 뒤로 이동시켜 공간을 만들게 됩니다.
그 후 새로운 데이터가 해당 위치로 삽입되게 됩니다.

 

Auto Increment의 사용 이유는?

앞의 이유를 상기해보면  클러스터링 테이블은 항상 pk기준으로 정렬되어 물리적인 저장소에 저장되게 된다.

이때  auto increment 키를 사용하면 새로운 레코드가 항상 기존 데이터의 끝에 추가되기 때문에, 디스크 페이지 분할이나 데이터 재정렬이 최소화됩니다. 이는 삽입 성능을 향상하는 장점이 있습니다.

 

 

인덱스의 성능 확인

아래는 pk를 기준으로 데이터를 조회했을 때와 그렇지 않은 필드를 조회했을 때의 성능 차이를 보여준다.
10만 건을 기준으로 조회했을 때 성능 차이가 상당히 심한 것을 확인할 수 있다. 같은 데이터를 Name으로 조회했을 땐 225ms가 걸렸지만 email로 조회했을 땐 4ms가 걸렸다 

 
 

논클러스터링 인덱스

논클러스터링 인덱스는 데이터베이스 테이블에서 레코드가 논리적으로 정렬된 인덱스를 의미합니다. 이 인덱스는 실제 데이터와는 별도로 존재하며, 데이터를 여러 가지 기준으로 정렬할 수 있습니다. 이는 데이터베이스 성능 최적화에 중요한 역할을 합니다.

 

논클러스터링 인덱스를 생성하기 위해서는 특정 필드를 기준으로 인덱스를 설정해야 합니다. 예를 들어, unique 속성을 필드 값으로 설정하면 자동으로 논클러스터링 인덱스가 생성됩니다. 또는 아래의 명령어를 통해 특정 칼럼을 기준으로하는 인덱스를 생성할 수 있습니다.

CREATE NONCLUSTERED INDEX idx_example ON TableName(ColumnName);

 

인덱스 구조와 성능의 관계

클러스터링 인덱스는 검색 속도에서 논클러스터링 인덱스보다 유리한데, 그 이유는 두 인덱스의 구조적 차이에서 기인합니다. 논클러스터링 인덱스는 리프 페이지가 데이터의 위치를 가리키는 페이지 인덱스와 행 정보를 포함하고 있습니다. 반면에 클러스터링 인덱스는 리프 페이지가 실제 데이터 페이지로 구성되어 있어, 데이터에 바로 접근이 가능합니다.

  1. 리프 페이지 구조: 클러스터링 인덱스는 리프 페이지 자체가 데이터 페이지로 구성되어 있어 검색 시 데이터 페이지로의 추가 탐색이 필요 없습니다. 반면 논클러스터링 인덱스는 리프 페이지가 데이터 페이지의 주소를 가리키고 있어, 검색 시 데이터 페이지로의 추가 탐색이 필요합니다.
  2. 검색 시 단계: 클러스터링 인덱스는 검색 시 단 한 번의 인덱스 탐색으로 데이터에 접근할 수 있습니다. 반면 논클러스터링 인덱스는 인덱스 탐색 후 데이터 페이지로 추가 접근이 필요하므로 검색 단계가 늘어납니다.
  3. 데이터 정렬: 클러스터링 인덱스는 테이블의 데이터가 물리적으로 정렬되어 있어, 범위 검색이나 순차 검색에서 높은 성능을 보입니다. 논클러스터링 인덱스는 논리적으로 정렬된 데이터 구조를 가지므로 범위 검색 시 추가적인 탐색이 필요합니다.

 

깊게 생각해보기

Q. Soft delete를 사용하는 이유는?

A. 삭제를 실시간으로 진행하면 cluster index에 실시간으로 연산이 필요하다. 따라서 is_deleted 필드를 두고 삭제된 것처럼 두고, 새벽 시간에 배치 작업을 통해 진짜 삭제를 진행해준다.

 

 

반응형