본문 바로가기
DataBase/이론

클러스터 인덱스와 넌 클러스터 인덱스 특징과 원리

by 서울에서 살아가기 2023. 6. 7.

 

 

 

 

데이터베이스 인덱스 개념을 공부하다 보면 클러스터 인덱스와 넌클러스터 인덱스란 단어를 접하게 되는데 클러스터 단어의 뜻은 무리, 군집이란 의미를 가지고 있습니다. 클러스터 인덱스와 넌 클러스터 인덱스를 어떻게 사용하느냐에 따라 성능에 미치는 영향이 다르다는 걸 알고 계신가요?

 

인덱스를 효율적으로 사용하기 위해 두 가지 내용에 대해 상세히 정리해보겠습니다.

 

 클러스터 인덱스

클러스터 인덱스는 실제 데이터와 같은 무리를 이루고 있는 인덱스를 의미하고, 가나다라 순으로 정렬된 사전을 생각하시면 됩니다.

 

데이터를 기반으로 자세히 알아보기 위해  테이블 생성 및 데이터 삽입을 진행합니다.

--테이블 생성
CREATE TABLE member {
    id int
    name varchar(255)
}

--데이터 삽입
INSERT INTO member VALUES(6, '삼성');
INSERT INTO member VALUES(2, '엘지');
INSERT INTO member VALUES(4, '현대');
INSERT INTO member VALUES(3, '기아');
INSERT INTO member VALUES(11, '라인');
INSERT INTO member VALUES(1, '쿠팡');
INSERT INTO member VALUES(5, '배민');
INSERT INTO member VALUES(7, '네이버');
INSERT INTO member VALUES(12, '당근');
INSERT INTO member VALUES(11, '토스');
INSERT INTO member VALUES(9, '넥슨');
INSERT INTO member VALUES(8, '카카오');

 

인덱스가 설정되지 않은 테이블에 데이터를 넣으면 입력한 순으로 순차적으로 쌓여 아래와 같은 구조로 삽입됩니다.

데이터-삽입
데이터 삽입

인덱스가 적용되어 있지 않은 테이블에서 데이터를 찾기 위해서는 처음부터 끝까지 순차적으로 접근하여 데이터를 찾아갑니다.

 

id 컬럼에 클러스터 인덱스를 적용해 보겠습니다.

인덱스-데이터-정렬
인덱스 데이터 정렬

 

클러스터 인덱스가 적용되면 아래와 같이 동작합니다.

 

  1. id 컬럼을 기준으로 데이터가 순차적으로 정렬됩니다.
  2. 정렬된 데이터를 기준으로 root nodes가 생성이 됩니다.

 

클러스터 인덱스가 적용된 컬럼은 데이터가 정렬이 유지되고 있고, 데이터가 추가되거나 삭제되어도 항상 최신 상태로 정렬을 유지하게 됩니다. 처음에 설명드린 가나다 순으로 정렬된 사전이 위 내용을 의미합니다.

 

클러스터 인덱스 적용 시 root nodes가 생성이 되는데 여기에는 클러스터 인덱스의 데이터와 각 주소가 저장이 됩니다. root nodes의 정보를 통해 실제 데이터 검색 시 빠르게 찾을 수 있도록 도와줍니다.

 

특징

  • 실제 데이터 자체를 정렬한다.
  • 테이블당 1개만 가질 수 있다. (보통 primary key)
  • 데이터가 인덱스 순서대로 정렬되어 있어, 정렬된 결과를 필요로 하는 쿼리 성능에 좋다.
  • 데이터의 물리적 순서와 인덱스의 순서가 일치하기 때문에, 데이터 삽입이나 삭제 시 재정렬이 필요하여 성능에 영향이 크다.

 

 

 넌 클러스터 인덱스

넌 클러스터 인덱스는 실제 데이터와 다른 무리를 이루고 있는 인덱스를 의미하고, 사전에 단어와 페이지 번호가 있는 목차 페이지를 생각하시면 됩니다.

 

인덱스 적용 전 원본 데이터를 입력합니다. 클러스터 인덱스 예시와 같은 데이터를 사용하겠습니다.

 

테이블-데이터
테이블 데이터

name 컬럼에 넌 클러스터 인덱스를 적용해 보겠습니다.

 

넌클러스터-인덱스-적용
넌 클러스터 인덱스 구조

 

넌 클러스터 인덱스를 적용하면 인덱스 관리를 위한 별도의 root node, leaf node 구조가 만들어집니다.

 

root node는 클러스터 인덱스와 동일합니다.

 

leaf node에는 인덱스를 적용한 컬럼(name)을 기준으로 정렬이 진행되고, 실제 데이터가 위치하고 있는 주소를 보관하고 있습니다. '기아' 데이터를 예를 들어 설명하겠습니다. '기아'가나다순으로 맨 앞에 위치하기 때문에 첫 번째로 정렬이 되어있습니다. 옆에 컬럼 '1000 + #04''1000'은 데이터 페이지의 주소를 의미하고, '#04'는 데이터 주소 1000의 4번째에 위치한다는 의미입니다.

 

넌 클러스터 인덱스에서 실 데이터들은 변경되어지지 않습니다.

 

넌 클러스터 인덱스가 어떤 방식으로 동작되는지 테이블에서 '현대' 데이터를 조회해 보겠습니다.

쿼리는 아래와 같습니다.

SELECT id, name FROM member
WHERE name = '현대'

 

인덱스-데이터-조회
인덱스 데이터 조회

  1. 인덱스 페이지인 leaf node에서 현대를 검색합니다.
  2. (1)에서 얻은 데이터 주소 '1000+#03'으로 실제 데이터를 검색해서 원하는 결과값을 가져옵니다.

 

특징

  • 실제 데이터 페이지는 변경되지 않는다.
  • 테이블당 여러 개를 가질 수 있다.
  • 데이터와 인덱스가 별도로 관리되어지기 때문에 추가 공간이 필요하다.
  • 데이터의 물리적 순서와 인덱스 순서가 일치하지 않아도 되기 때문에 데이터 삽입이나 삭제 시 인덱스 구조 변경이 덜 발생한다.

 

 

 
 

[함께보면 좋은 자료]

 

>>> 데이터베이스 인덱스(Index) 개념과 검색 성능 튜닝

 

 

[참고자료]

 

>>> Youtube(우아한 tech)

 

 

 

반응형

댓글