인덱스란 데이터베이스 테이블의 검색속도를 향상시키기 위해 추가적인 저장 공간과 쓰기 작업을 활용하는 자료구조이다. 데이터베이스 테이블의 모든 데이터를 검색하면 시간이 오래 걸리기 때문에, 데이터와 데이터의 위치를 포함한 자료구조를 생성하여 빠르게 조회할 수 있게 한다.
인덱스를 활용하면 데이터를 조회하는 작업이 필요한 SELECT, UPDATE, DELETE 모두 성능이 향상된다. 인덱스를 사용하지 않은 컬럼을 조회할 때는 테이블 전체를 탐색하는 full scan이 이루어진다.
DBMS는 값을 빠르게 탐색하기 위해 index를 항상 최신의 정렬된 상태로 유지시키는 작업을 행하는데, 이러한 작업들은 INSERT, UPDATE, DELETE가 수행될 때 추가적으로 실행되며, 그에 따른 오버헤드가 발생한다.
인덱스에는 대표적으로 해시 테이블과 B+Tree자료구조가 사용될 수 있다.
[해시 테이블]
해시 테이블은 key,value로 데이터를 저장하는 자료구조로 빠른 검색을 사용할 때 유용하다.
해시 함수는 값이 조금만 달라져도 완전히 다른 해시값을 만들어내기 때문에, 등호(=)연산에 특화되어 있지만, 부등호 연산(>,<)이 자주 사용되는 데이터베이스 검색을 위해서는 해시 테이블이 그닥 적합하지 않다. 따라서 인덱스의 자료구조로는 보통 B+Tree가 사용된다.
[B+Tree]
B+Tree는 부등호를 이용한 순차 검색이 자주 발생될 수 있다는 점을 고려해 leaf node들을 LinkedList로 연결하여 인덱스에 맞게 검색을 최적화하였다.
다음과 같은 특성을 지닌다.