INDEX는 데이터를 빠르게 찾을 수 있도록 도와주는 도구이다.
INDEX에는 클러스터형 인덱스와 보조 인덱스가 있다.
CLUSTERED INDEX는 기본 키로 지정하면 자동 생성되며 테이블에 1개만 만들 수 있다.
기본 키로 지정한 열을 기준으로 자동 정렬된다.
SECONDARY INDEX는 고유 키로 지정하면 자동 생성되며 여러 개를 만들 수도 있지만 자동 정렬되지는 않는다.
길이가 광범위한 책에서 원하는 단어를 찾는 경우, 책 맨앞 혹은 맨뒤의 목차나 인덱스를 통해서 빠르게 원하는 단어와 관련된 내용들을 찾아볼 수 있다.
DB의 INDEX도 위와 같은 기능을 하는데, 테이블의 용량이 거대해질수록 INDEX의 유무에 따라 성능 차이가 확실하게 드러나며 데이터를 탐색하는 경우 INDEX에 따라 탐색 시간이 확실하게 차이난다.
결과값에 차이가 있는 것은 아니다.
INDEX가 있으면 데이터를 찾을 때 성능 차이가 확연하게 차이나지만 반대로 INDEX가 너무 많은 경우 필요 없는 INDEX를 계속 확인할 수 있다.
이러한 경우 INDEX와 테이블을 계속 왔다 갔다 하면서 오버헤드가 발생할 수 있다.
물론 MYSQL은 INDEX를 사용해 검색하는 것이 빠를지 아니면 전체 테이블 검색이 빠를지 알아서 판단한다. 만약 INDEX를 사용하지 않는다면 사용하지도 않는 찾아보기를 만든 것이 되므로 쓸데없이 공간을 낭비하는 셈이다.
INDEX는 SELECT에서 즉각적인 효과를 내는 빠른 방법 중 하나이다.
즉, 적절한 인덱스를 생성하고 인덱스를 사용하는 SQL을 만들면 기존보다 아주 빠른 응답 속도를 얻을 수 있다.
위에 설명하였듯이, 인덱스는 클러스터형 인덱스(CLUSTERED INDEX)와 보조 인덱스(SECONDARY INDEX) 두 종류로 나뉜다.
인덱스는 테이블의 열 단위에 생성되며, 하나의 열에는 하나의 인덱스를 생성할 수 있다.
테이블 정의 시 PK를 지정하는데, 이 PK의 열에는 자동으로 CLUSTERED INDEX가 생성이 된다.
그런데 PK는 테이블 당 하나만 지정이 가능하므로 결국 클러스터형 인덱스는 한 테이블에 하나만 만들 수 있다.
PK에 더불어 UNIQUE에도 자동으로 인덱스가 생성되며 이는 보조 인덱스이다.
클러스터형 인덱스는 PK를 지정할 때 자동으로 생성되며 테이블 당 1개만 생성이 된다.
PK를 보통 사전과 많이 비유를 하는데, 사전과 유사하게 어떤 열을 PK로 지정하면(CLUSTERED INDEX가 생성되면) 그 열을 기준으로 자동 정렬이 된다.
이미 대용량의 데이터가 있는 상태에서 PK를 지정하면 시간이 엄청 오래 걸릴 수 있다.
또한 PK를 변경하는 경우 논리적으로 위험하지 않도록 주의하면서 변경해야한다.
UNIQUE 지정시 보조 인덱스가 생성이 되며, 이는 한 테이블에 여러 개 설정할 수 있다.
따라서 보조 인덱스가 열마다 생성된다 하더라도 데이터의 내용이나 순서는 변경되지 않는다.
또한 보조 인덱스는 여러 개 만들 수 있지만 보조 인덱스를 만들 때마다 DB의 공간을 차지하게 되고, 전반적으로 시스템에 오히려 나쁜 영향을 미치게 된다.
그러므로 꼭 필요한 열에만 적절히 보조 인덱스를 생성하는 것이 좋다.