데이터베이스 테이블에 대한 검색 성능의 속도를 높여주는 자료구조이다.
특정 column에서 인덱스를 생성하면, 해당 column의 데이터들을 정렬하여 별도의 메모리 공간에 데이터 물리적 주소와 함께 저장된다.
인덱스의 가장 큰 장점은 데이터가 오름차순으로 정렬되어 있다는 것이다.
기존 테이블과 달리 인덱스 테이블은 정렬되어 저장되어 있기 때문에 해당 조건(WHERE
)에 맞는 데이터들을 빠르게 찾아낼 수 있다.
부하가 굉장히 많이 걸리는 작업인 ORDER BY
정렬 과정을 피할 수 있다.
인덱스 테이블이 정렬되어 있기 때문에 시작 값과 끝 값만 가져오면 된다.
인덱스의 가장 큰 단점은 데이터의 정렬된 상태를 계속 유지시켜줘야 한다는 점이다.
삽입/갱신/삭제를 통해 데이터가 추가되거나 바뀐다면 인덱스 테이블 내의 값들을 다시 정렬해야 한다.
인덱스는 테이블의 전체 데이터 중 10~15% 이하의 데이터를 처리하는 경우에만 효율적이다.
인덱스를 관리하기 위해 데이터베이스의 약 10%에 해당하는 주소공간이 필요하다. 무턱대고 인덱스를 많이 만들면 데이터베이스의 성능 부하를 초래한다.
다음과 같은 경우 인덱스를 사용하기 좋다.
JOIN
이나 WHERE
/ORDER BY
에 자주 사용되는 경우인덱스를 구현하기 위해서는 다양한 자료구조를 사용할 수 있는데, 가장 대표적인 예시로는 해시 테이블과 B+Tree가 있다.
key-value 한 쌍으로 데이터를 저장하는 자료구조.
리프 노드에만 데이터를 저장하고 리프 노드가 아닌 노드에서는 자식 포인터만 저장하는 자료구조.
리프 노드끼리는 연결 리스트로 연결되어있다. B+Tree에서는 반드시 리프 노드에만 데이터가 저장되기 때문에 중간 노드에서 key를 올바르게 찾아가기 위해서 key가 중복될 수 있다.
참조