
GIF 출처 : https://logpresso.store/ko/apps/mysql
1 ) 인덱스 ( Index ) 란?
2 ) 클러스터형 인덱스 ( Clusterd Index )
3 ) 비클러스터형 인덱스 ( Non - Clusterd Index )
인덱스 ( Index ) 란?
: 인덱스란 필요한 데이터를 바로 찾을 수 있도록 참고하는 데이터를 의미한다.
이를 통해 수많은 데이터 중 특정 조건을 만족하는 데이터를 조회할 때마다 모든 데이터를 일일이 검사해서 필요한 데이터를 찾아야 하는 비용을 감소시킬 수 있다.
- 장점
① 원하는 데이터를 빠르게 검색할 수 있음
② 데이터 조회 뿐만 아니라 조인 시에도 빠른 성능을 얻을 수 있음
- 단점
① 인덱스를 별도로 저장하는 인덱스 페이지를 구성하기 위해 추가 공간이 필요
② 데이터를 수정할 때 연결된 정보도 함께 수정해야하는 경우 추가 비용이 발생
- 종류
( 1 ) 클러스터형 인덱스 ( Clusterd Index )
( 2 ) 비클러스터형 인덱스 ( Non - Clustered Index )
클러스터형 인덱스 ( Clusterd Index ) 란?
: 사전식으로 데이터가 정렬되어있고 인덱스 안에 데이터가 들어 있어 빠르게 데이터를 조회할 수 있는 방식을 의미한다. 클러스터형 인덱스는 인덱스를 기준으로 데이터가 자동으로 정렬되어 저장되며 , 인덱스의 리프 페이지에는 데이터가 존재한다.
이는 인덱스 자체가 물리적 순서를 결정함을 의미한다.
- 특징
① 테이블 당 1개만 존재할 수 있다.
② 기본키로 지정된 열은 클러스터형 인덱스가 자동으로 생성된다.
③ 실제 저장된 데이터와 같은 순서로 물리적인 데이터 페이지 구조를 갖는다.
④ 클러스터형 인덱스를 기준으로 데이터가 자동으로 정렬된다.
⑤ 기본키를 변경하면 클러스터형 인덱스가 변경되므로 변경된 기본키를 기준으로 데이터가 다시 정렬된다.
- 생성 및 삭제
먼저 테이블을 생성후에 col_1 열에 무작위로 순서대로 번호를 삽입한다. 이 후에 col_1열에 기본키를 지정한 후 SELECT 문을 사용하면 기본키를 기준으로 정렬된 것을 확인할 수 있다. 
만약 기본키를 다른열로 변경할 경우 col_1 기준이 아닌 다른 Column 기준으로 변경된다. 또한 2개 이상 합한 인덱스를 생성할 수 있는데 이를 복합키 ( Composite Key ) 라고 한다. 
비클러스터형 인덱스 ( Non - Clustered Index ) 란?
: 비클러스터형 인덱스란 실제 데이터가 위치한 주소 정보로 인덱스 페이지를 별도로 생성하며 데이터를 정렬하지 않는 방식을 의미한다. 따라서 테이블당 비클러스터형 인덱스는 여러개 생성할 수 있다.
리프 페이지에는 실제 데이터의 주소인 RID(Row Identifier) 값을 가지고 있으며 루트와 논리프 노드는 인덱스 정보를 가지고 있다.
비클러스터형 인덱스는 리프 페이지의 주소를 참조하여 실제 데이터 페이지로 가서 데이터의 정보를 읽는 방식이다.
- 특징
① 한 테이블에 여러 개 설정할 수 있다.
② UNIQUE 명령어로 고유 열을 지정할 때 비클러스터형 인덱스 ( 보조 인덱스 ) 가 자동으로 생성된다.
③ 실제 저장된 데이터와 다른 물리적인 데이터 페이지 구조를 갖는다.
④ 클러스터형 인덱스와 달리 데이터를 정렬하지 않는다.
⑤ CREATE INDEX 문으로 비클러스터형 인덱스 ( 보조 인덱스 ) 를 직접 생성할 수 있다.

- 생성 및 삭제
먼저 클러스터형 인덱스 예시와 마찬가지로 테이블 생성후 데이터를 무작위로 생성하여 입력한다.
이후 col_1 열을 기본키로 지정한다.

그 다음 col_2을 기준으로 조회할 때 , PRIMARY KEY를 조회하는 것이 아닌 col_2값을 기준으로 조회하면 비클러스터형 인덱스를 참조하여 간접 조회를 실행하게 된다.

해당 쿼리 실행과정은 다음과 같다.
col_3 = 'turtle'조건 → 비클러스터 인덱스col_3탐색- 해당 인덱스 리프 노드에서 →
col_1 = 1을 얻는다.- 해당 PK값으로 클러스터형 인덱스에 접근해서 전체 행을 가져온다.
PK의 경우 자동적으로 클러스터형 인덱스가 되고 PK를 제외한 나머지 Column에 대해서는 인덱스 지정 키워드를 통해 인덱스를 지정할 수 있다. 해당 키워드를 사용할 경우 B+ Tree에서 인덱스에 대한 노드가 생성된다.

마지막으로 클러스터형 인덱스와 마찬가지로 DROP 키워드를 통해 비클러스터형 인덱스를 삭제할 수 있다.
