[데이터베이스] 인덱스
1. 인덱스란?
추가적인 쓰기 공간과 저장 공간을 활용하여 데이터베이스의 검색 속도를 향상시키기 위한 자료구조.
예를 들어 하나의 책을 볼 때 앞에 목차가 있어서 원하는 페이지를 쉽게 찾을 수 있듯이,
데이터베이스에서도 인덱스를 두어 원하는 정보를 보다 빠르게 검색할 수 있도록 한다. 인덱스가 책의 목차의 개념이 된다.
2. 인덱스의 특징 및 사용하는 이유.
실제 DB에 많은 값들이 저장이 되면 select 문을 실행시킬 때 where 절에서 많은 시간이 소요된다.
이러한 속도 저하 문제를 index를 통해 해결하는 방법이 있기 때문에 알아두면 편리하다.
1) 인덱스는 정렬이 되어있다.
테이블을 만들고 뒤죽박죽으로 데이터들을 저장하고 나면, 검색시 모든 데이터들을 확인하여 많은 시간이 소요된다.
하지만, 인덱스는 데이터들이 정렬되어있기 때문에 데이터를 보다 빠르게 검색이 가능하다.
2) 정렬이 되어있기 때문에 order by를 사용 안해도 된다.
order by 과정은 많은 부하가 걸리는 작업이다. 하지만 인덱스는 정렬이 되어 있어, 해당 작업을 할 필요가 없다.
마찬가지로 min / max 값 뽑아오기도 쉽다.
다음과 같은 조건에서 사용하면 좋다.
- insert / update / delete 문이 자주 실행되지 않는 테이블
- join / order by / selete 문이 자주 실행되는 테이블
- 규모가 큰 테이블
3. 인덱스의 단점
1) 매번 정렬을 해줘야 한다.
정렬이 되어있다는 것은 장점이지만, 반대로 매번 정렬을 해줘야하기 때문에 그에 따른 자원 소모가 따른다.
그렇기 때문에 insert/update/delete 문이 자주 발생하는 테이블에서는 지양한다.
2) 불필요한 저장 공간이 생길 수 있다.
인덱스를 사용하기 좋을 때에는 테이블의 전체 데이터 중 10~15%만 사용할 때이다.
그 이상을 사용할 때에는 인덱스 없이 테이블을 사용하는 것이 낫다.
인덱스를 관리하기 위해서는 데이터베이스의 10%의 저장공간을 더 사용하기 때문에 사용이 분명할 때에만 생성하고 관리하는 것이 좋다.
4. 인덱스를 구현하기 위한 자료 구조들
인덱스를 구현하기 위해서는 다양한 자료구조를 사용할 수 있다.
그 중 해시 테이블과 B+ 트리가 있다.
1) 해시 테이블
해시 테이블은 (key, value) 쌍으로 구성된 자료구조로,
인덱스에서는 key가 칼럼의 값, value가 물리적 주소를 저장하여 활용한다.
그래서 탐색 시 시간복잡도가 O(1)이다.
💡 하지만 잘 활용하지 않는다.
이유는 해시는 (=) 등호에만 특화되어 있기 때문에, 값이 1이라도 달라지만 아예 다른 해시값이 생성된다.
이러한 특성으로 인해 (<, >) 부등호를 활용한 검색에서는 오히려 효율이 떨어진다.
그래서 B+Tree 자료구조를 더 많이 활용한다.
2) B+ Tree
📝 B- Tree란?
전산학에서 B-트리(B-tree)는 데이터베이스와 파일 시스템에서 널리 사용되는 트리 자료구조의 일종으로,
이진 트리를 확장해 하나의 노드가 가질 수 있는 자식 노드의 최대 숫자가 2보다 큰 트리 구조이다.
자료를 정렬된 상태로 보관한다.
📌 B+ Tree는 B- Tree 구조의 발전된 구조이다.
기존 B- Tree의 단점은 탐색시 노드를 찾아서 이동해야하는 단점이 있다. 이러한 단점을 보완해서 나온데 B+ Tree이다.
B+ Tree는 같은 레벨의 있는 노드들은 모두 정렬되어 있고, 모든 리프 노드들은 연결리스트 형태를 유지한다는 것이다.
모든 노드에 데이터 값을 저장하는 B- Tree와 다르게 밑의 차이를 나타낸다.
리프 노드가 아닌 노드들은 인덱스 노드가 되고, 리프 노드는 데이터 노드가 된다.
인덱스 노드의 value는 다음 노드를 가리킬 수 있는 포인터 주소가 존재하고,
데이터 노드의 value는 검색키인 데이터와 해당 레코드의 주소를 가진다. 또한 데이터 노드의 값은 중복되지 않는다.
따라서 키 값은 중복될 수 있고,
데이터 검색을 위해서는 반드시 리프 노드가 있는 레벨까지 내려가야하는 특징이 있다.
하지만 리프노드들이 모두 정렬되어 있고, 연결리스트 구조이기 때문에 순차 탐색에 적절하다.
시간 복잡도는 트리이므로 평균적으로 O(logN)이다.
아래의 그림은 innoDB의 B+ 트리 구조이다.
출처
https://coding-factory.tistory.com/746
https://mangkyu.tistory.com/96
https://velog.io/@alicesykim95/DB-%EC%9D%B8%EB%8D%B1%EC%8A%A4Index%EB%9E%80
https://ssocoit.tistory.com/217