Next-Squad/Interview-Question

[Database] 5. Clustered Index와 Non-Clustered Index 의 차이

CMSSKKK opened this issue · 1 comments

Clustered Index와 Non-Clustered Index 의 차이

키워드

B-Tree, 커버링 인덱스

MySql을 기준으로 설명하겠습니다.

Clustered Index는 Clustering Index로도 불립니다.

MySql 기준으로 Clusterd Index는 InnoDB에서만 사용됩니다.
InnoDB 엔진(default)을 사용했을 때, Table을 생성하면 기본적으로 Clusetered Index가 생성됩니다.

PK가 있다면, PK를 Key로 생성되며, 만약 PK가 없다면 NOT NULL인 첫번째 Unique Index를 key로 생성합니다.
그마저도 없다면 Hidden Key를 생성하여 Key로 사용합니다.

Clustered Index는 B+Tree 자료구조로 구성되어있어, 기존 B-Tree와 차이가 있습니다.
기본 Index의 경우 B-Tree의 리프노드에는 데이터 파일의 레코드 주소를 가지고있습니다.

하지만 Clustered Index의 경우 리프노드에 Record를 가지고 있습니다.
그래서 레코드를 물리적으로도 정렬하여 저장합니다.

그렇기 때문에 Clustered Index를 Clustered table이라고도 부릅니다.

PK를 변경하는 경우는 거의 없지만, PK를 변경한다면 레코드의 저장위치(페이지)도 변경됩니다.

Non-Clustered Index는 사용자가 직접 추가해주는 인덱스(기본적인 인덱스)입니다.
Non-Clustered Index의 리프노드에는 인덱스의 컬럼값과 Clustered Index의 Key가 저장되어있습니다.
그래서 데이터 파일에 접근할 때는 결론적으로 Clustered Index를 타고 접근하게 됩니다.
레코드의 위치는 Clustered Index만이 알고있습니다.

커버링 인덱스란 Non-Clustered Index를 활용해서 데이터를 검색할 때,
Clustered Index를 타고 데이터를 접근하는 과정이 없는 경우를 뜻합니다.
즉, 인덱스에 있는 컬럼값들로만 쿼리를 완성하는 것입니다.

데이터를 읽는 과정이 없기 때문에 성능을 향상시킬 수 있습니다.

TODO 커버링 인덱스 조건을 충족시키는 방법 공부하기!

Primary index vs Secondary index

InnoDB 기준으로는 일반적으로 Clustered Index가 Primary index가 되고,
Non-Clustered index가 Secondary index가 됩니다.

하지만 Primary index의 기본적인 의미는 PK를 key로 index를 만드는 것을 의미합니다.
PK를 기준으로 하기에 Not null과 unique 제약조건을 가집니다.

하지만 Clustered index는 위에서 설명했듯이,
PK로만 만들어지는것은 아니기 때문에 Clustered index와 Primary index는 같다고 할 수 없습니다.

Secondary index는 unique 제약조건이 없는 인덱스로, 중복이 있을 수 있습니다.

References