인덱스(Index)는 색인이라고도 불리며 그 역할은 검색속도를 향상시키는 데 있습니다.
여기서 검색은 SELECT
명령 및 WHERE
구를 통해 조건을 지정하여 그에 알맞는 행을 찾는 과정을 의미합니다.
테이블에 인덱스가 존재하면 효율적인 검색이 가능해져 WHERE
구로 조건이 지정된 SELECT
명령의 처리 속도가 향상됩니다.
예를 들어 목차를 생각하면 편합니다.
백과사전에 목차가 존재하지 않으면 과일이라는 단어를 찾을 때 앞에서부터 하나씩 다 살펴봐야 합니다.
그러나 목차가 존재하면 해당 목차를 통해 과가 일치하는 곳으로 바로 가서 훨씬 효율적으로 찾을 수 있습니다.
인덱스 또한 이처럼 검색에 사용되는 키워드와 대응하는 행의 장소가 저장되어 있습니다.
인덱스가 지정되지 않은 테이블을 검색할 때는 풀 테이블 스캔(Full Table Scan)이라 불리는 검색 방법을 사용합니다.
이진 탐색(Binary Search)은 집합을 반으로 나누어 조사하는 방법으로 차례로 나열된 집합에 대해 유효한 검색 방법입니다.
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| 1 | 2 | 3 | 5 | 10 | 11 | 19 | 20 | 23 | 30 | 31 | 32 | 38 | 40 | 100 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
이런 방식을 사용하면 결국 집합의 개수 또는 길이만큼 반복해야 했던 풀 테이블 스캔과 비교하여 이진 탐색은 선형 로그 시간이 걸립니다.
선형 로그 시간은 자료구조의 복잡도(Complexity)에서 등장하는 개념입니다. 어떤 행위를 수행하기 위해 걸리는 시간과 공간을 수치화하는 표현이라 생각하면 편합니다.
위 이진 탐색의 집합 예시를 이진 트리로 표현하면 아래와 같습니다.
트리는 노드(Node)라는 요소로 구성됩니다.
그리고 각 노드는 두 개의 가지(Branch)로 나뉩니다.
이때 두 가지를 비교했을 때 좌측 가지에는 더 작은 값이, 우측에는 더 큰 값이 놓입니다.
이처럼 두 개의 가지로 분기하는 구조라서 이진 트리라 부릅니다.
검색은 이러한 이진 트리의 가지를 통해서 행해집니다.
맨 위 10이라는 루트 노드(Root Node)를 시작으로 이진 탐색과 비슷한 방식을 사용하여 원하는 수치와 비교해 더 작으면 왼쪽 가지를, 더 크면 오른쪽 가지를 선택해 조사해 나갑니다.
이러한 유일성을 위해 결국 데이터베이스 또한 기본키 제약을 통하여 유일한 값을 가지게 해야 합니다.