인덱스(Index)는 데이터베이스의 테이블에 대한 검색 속도를 향상시켜주는 자료구조이다 .
인덱스는 목차
, 색인
이라고 생각하면 편하다.
테이블의 특정 컬럼에 인덱스를 생성하면 해당 컬럼의 데이터
를 정렬한 후 별도의 메모리 공간
에 데이터의 물리적 주소와 함께 저장된다.
데이터의 수정이 잦은경우 인덱스도 같이 수정해야하기 때문에 성능이 낮아진다. 또한 인덱스를 제거 하는것이 아니라 사용하지 않음 으로 남겨두기 때문에 수정이 많을 경우 실제 데이터에 비해 인덱스가 과도하게 커지는 문제점이 발생할 수 있다.
예를 들어 나이나 성별과 같이 값의 범위가 적은 컬럼인 경우에는 인덱스를 읽고 나서 다시 많은 데이터를 조회해야 하기 때문에 비효율적인 작업이다.
인덱스는 자료구조를 이용해서 구현할 수 있다.
해시 테이블은 key
와 value
를 한 쌍으로 데이터를 저장하는 자료구조이다. (key, value)로 쌍을 표현하며, key값을 이용해 대응되는 value값을 구하는 방식이다. 평균적으로 O(1)의 매우 빠른 시간만에 원하는 데이터를 탐색할 수 있는 구조이다.
해시 테이블을 이용한다면 인덱스는 (key, value) = (컬럼의 값, 데이터의 위치)
로 구현하는데, 해시 테이블은 실제로 인덱스에서 잘 사용되지 않는다.
그 이유는, 해시 테이블은 등호(=) 연산에 최적화되어있기 때문이다. 데이터베이스에선 부등호(<, >) 연산이 자주 사용되는데, 해시 테이블 내의 데이터들은 정렬되어 있지 않으므로 특정 기준보다 크거나 작은 값을 빠른 시간 내에 찾을 수가 없다.
B+Tree는 기존의 B-Tree의 단점을 개선시킨 자료구조이다.
B+Tree는 오직 leaf node
에만 데이터를 저장하고 leaf node가 아닌 node
에서는 자식 포인터만 저장한다.
그리고 leaf node
끼리는 Linked list
로 연결되어있다.
또, B+Tree에서는 반드시 leaf node
에만 데이터가 저장되기 때문에 중간 node에서 key를 올바르게 찾아가기 위해서 key가 중복될 수 있다는 단점도 있다.
데이터베이스의 인덱스 컬럼은 부등호를 이용한 순차 검색 연산이 자주 발생될 수 있다. 이러한 이유로 BTree의 리프노드들을 LinkedList로 연결하여 순차검색을 용이하게 하는 등 BTree를 인덱스에 맞게 최적화하였다.
인덱스의 장단점, 간단한 내부구조를 알 수 있었습니다. 감사합니다.