Index란 말그대로 색인이라는 의미를 갖습니다.
색인은 데이터를 빠르게 조회할 수 있도록 도와주는 기능이라고 할 수 있습니다. 대표적으로 해쉬 인덱스와 B-Tree 인덱스가 있습니다.
해시 인덱스
Key Value로 데이터를 저장하는 자료구조 중 하나로, 하나의 데이터 검색할 때 유용합니다. 그러나 부등호 연산이 자주 사용되는 검색에서는 해시 인덱스는 적합히지 않습니다.
B-Tree
대부분의 데이터베이스에서 사용되는 B-Tree 자료구조는 이진 트리에서 파생된 구조이고 가장 상단의 노드를 루트 노드, 중간을 브랜치 노드, 가장 아래의 리프노드로 구성이 되어있습니다. 하나의 노드는 2개 이상의 키와 데이터를 가질 수 있는 점과 자식 노드 또한 여러 개의 키와 데이터를 가질 수 있다는 특징과 자동으로 구조를 조정하는 셀프 밸런싱 특징이 있어 트리의 높이를 낮출 수 있게 되어 보다 빠르게 조회가 가능합니다.
B+Tree
B-Tree의 확장된 개념으로 각 노드에 key와 data를 담는 B-Tree구조와는 다르게 브랜치 노드에 Key만 담아두고, 오직 리프 노드에만 key와 data를 저장하고 리프 노드끼리 Linked List로 연결되어 있습니다. 이로 인해 메모리를 확보하고 노드에 더 많은 key를 수용할 수 있게되어 트리의 높이는 더 낮아지는 효과를 볼 수 있습니다. 또한 풀 스캔시에도 리프노드에 데이터가 모두 있어 한 번의 선형 탐색만 하면 되기 때문에 모든 노드를 확인해야하는 B-tree에 비해 빠릅니다.
인덱스를 적절히 지정하는 순서는
인덱스를 지정하는 것은 추가 적인 공간과 시간이 필요하기에 많은 필드에 인덱스를 걸게되면 오히려 성능에 악영향을 미칠 수 있습니다.
- 같음을 비교하는 등치 조건으로 사용되는 컬럼을 우선으로하고
- 정렬에 쓰는 필드를 다음으로 지정합니다.
- 다중 값을 출력해야 하는 필드, 쿼리 자체가 부등호거나 많은 값을 출력해야하는 쿼리에 쓰는필드는 나중에 인덱스를 설정합니다.