인덱스(Index)란?
- 데이터베이스의 테이블에 대한 검색 속도를 향상시켜주는 자료구조
- 테이블의 특정 컬럼에 인덱스를 생성하면, 해달 컬럼의 데이터를 정렬한 후 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장
- 컬럼의 값(Key) - 물리적 주소(Value)
인덱스 관리
- DBMS는 Index를 항상 최신의 정렬된 상태로 유지해야 원하는 값을 빠르게 탐색 할 수 있다
- 인덱스가 적용된 컬럼에서 INSERT, UPDATE, DELETE가 수행된다면 각각 다음과 같은 연산을 추가적으로 해주어야 함 => 오버헤드 발생
- INSERT : 새로운 데이터에 대한 인덱스를 추가함
- DELETE : 삭제하는 데이터의 인덱스를 사용하지 않는다는 작업을 진행함
- UPDATE : 기존의 인덱스를 사용하지 않음 처리하고, 갱신된 데이터에 대해 인덱스를 추가함
인덱스 장단점
- 장점
- 테이블을 조회하는 속도와 그에 따른 성능을 향상시킬 수 있다
- 전반적인 시스템의 부하를 줄일 수 있다
- 단점
- 인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장공간이 필요하다
- 인덱스를 관리하기 위해 추가 작업이 필요하다
- 인덱스를 잘못 사용할 경우 오히려 성능이 저하되는 역효과가 발생할 수 있다
- 만약 INSERT, DELETE, UPDATE가 빈번한 속성에 인덱스를 걸게 되면 인덱스의 크기가 비대해져서 성능이 오히려 저하되는 역효과가 발생할 수 있다.
인덱스를 사용하면 좋은 경우
- 규모가 큰 테이블
- INSERT, DELETE, UPDATE가 자주 발생하지 않는 컬럼
- JOIN이나 WHERE 또는 ORDER BY가 자주 사용되는 컬럼
- 데이터의 중복도가 낮은 컬럼
인덱스의 자료구조
- 해시 테이블(Hash Table)
- (Key, Value)로 데이터를 저장하는 자료구조 중 하나로 빠른 데이터 검색이 필요할 때 유용
- (Key, Value) = (컬럼의 값, 데이터의 위치)
- 등호(=)연산에 최적화되어있기 때문에 부등호(<, >) 연산이 자주 사용되는 데이터베이스에선 자주 사용되지 않음
- B+ Tree
- 모든 데이터를 한 번 순회하는 데에는 트리의 모든 노드를 방문해야 하는 비효율적인 B-Tree의 단점을 개선시킨 자료구조
- 오직 leaf node에만 데이터를 저장하고 leaf node가 아닌 node에서는 자식 포인터만 저장
- leaf node끼리는 Linked list로 연결되어 있음
참고