한 테이블에 클러스터형 인덱스와 보조 인덱스가 동시에 있다면 어떤 구조일까?

2023. 9. 7. 15:21DB

728x90

이에 대하여 알기 위해서는 클러스터형 인덱스만 존재할 때 그리고 보조 인덱스만 존재할 때 어떤 구조로 페이지들이 만들어지는 지에 대해서 학습하여야한다.

 

 

클러스터형 인덱스 (Primary Index)

 

특정 데이터를 기준으로 정렬해주는 인덱스로, 데이터 페이지 전체가 이를 기준으로 정렬된다.

 

이는 아래와 같은 특성을 가지고 있다.

 

  • 한개의 테이블에 한 개씩만 만들 수 있다.
  • 보조 인덱스보다 검색 속도는 빠르지만, 입력/수정/삭제는 느리다.

 

 

위 그림에서 볼 수 있듯이 리프 페이지자체가 PK를 기준으로 정렬된 것을 알 수 있다.

또한, 리프 페이지가 (PK, 데이터) 형태이다.

 

 

보조 인덱스 (Secondary Index)

 

이 인덱스는 후보키에만 부여할 수 있으며, 데이터 페이지는 따로 정렬되지는 않고 인덱스를 위한 별도의 페이지가 만들어진다.

 

이는 아래와 같은 특성을 가지고 있다.

 

  • 클러스터형 인덱스보다 검색 속도는 느리지만, 데이터의 입력/수정/삭제는 빠르다.
  • 보조 인덱스는 여러개 생성이 가능하다.


 

위 그림에서 볼 수 있듯이 데이터 페이지는 데이터가 삽입된 순서 그대로 유지되어 있으며, 세컨더리 인덱스를 위한 인덱스 페이지가 별도로 만들어져있다.

또한, 리프 페이지는 (세컨더리 인덱스 칼럼, 주소)형태이다.

 

 




이제 본격적으로 클러스터형 인덱스와 보조 인덱스가 혼합되어 있는 경우 어떤 구조로 되어있는 지 살펴보자!

 

예를 들어 아래와 같은 테이블이 있다고 하자!

 

CREATE TABLE mixedtb1(
userID CHAR(8) NOT NULL,
name VARCHAR(10) NOT NULL,
addr char(2)
);

ALTER TABLE mixedtb1 ADD CONSTRAINT PK_mixedtb1_userID PRIMARY KEY (userID);
ALTER TABLE mixedtb1 ADD CONSTRAINT UK_mixedtb1_name UNIQUE (name);

 

위와같은 상황에 데이터들을 INSERT한다면, 아래와 같이 나타낼 수 있다.


클러스터형 인덱스 + 세컨더리 인덱스일 때의 구조

 

위 사진에서 중요한 것은 2가지이다.

 

첫째, 보조 인덱스 페이지의 리프 페이지들이 (세컨더리 인덱스 컬럼, 주소)형태가 아니라 (세컨더리 인덱스, PK)형태인 것

둘째,  보조 인덱스를 검색한 후에 클러스터형 인덱스의 루트 페이지부터 검색한다는 것이다.

 


왜 이런 구조를 하게 되었을 까??

만약, 보조 인덱스의 리프 페이지가 데이터 페이지의 주솟값으로 되어있다고 가정해보자. 데이터가 삽입되어 클러스터형 인덱스 페이지가 재구성되었을 때 보조 인덱스의 리프 페이이지의 데이터 페이지 주솟값또한 변경되어야할 것이다. (보조 인덱스 컬럼, PK)로 하는 것이 검색에 있어서 약간의 손해를 볼 수 있겠지만 재구성 측면을 고려하였을 때 이 방식이 더 효율적이다.



 

감사합니다~

728x90