인덱스
인덱스(index)란?
인덱스는 데이터베이스 테이블에 대해 검색 속도를 높여주기 위해 사용되는 자료구조
이다.
특정 컬럼에 인덱스를 생성하면, 해당 컬럼의 데이터를 정렬하여 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장한다.
이미지 출처 : https://coding-factory.tistory.com/746
위 사진의 경우 Data
를 기준으로 인덱스를 생성해 Table의 Location을 탐색한다.
인덱스의 관리
DBMS는 index를 항상 최신의 데이터를 정렬된 상태로 유지해야 원하는 값을 빠르게 탐색 할 수 있다.
그러기 위해서는 인덱스가 적용된 컬럼에 INSERT,UPDATE,DELETE가 수행된다면 계속 정렬을 해줘야하고 그에 따라 부하가 발생하기도 한다.
이런 부하를 최소화하기 위해서 인덱스는 데이터 삭제 대신 인덱스를 사용하지 않음으로 처리한다.
- INSERT : 새로운 데이터에 대한 인덱스를 추가한다
- DELETE : 삭제하는 데이터의 인덱스를 사용하지 않음 처리한다
- UPDATE : 기존의 인덱스를 사용하지 않음 처리하고, 갱신된 데이터에 대해 인덱스를 추가한다
인덱스의 장점과 단점
장점
- 조건 검색(Where)을 할 때 레코드 처음부터 끝까지 비교하는 풀 테이블 스캔을 할 필요 없이 빠르게 찾아 낼 수 있다
- 정렬(Order by)을 할 때 sort 과정이 필요하지 않게 된다
- MIN,MAX 또한 풀 테이블 스캔을 할 필요 없으므로 효율적인 처리가 가능하다
단점
- 인덱스를 최신으로 정렬된 상태를 계속 유지 시키거나 관리를 위한 추가 작업이 필요하다
- 인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장공간이 필요하다
- 인덱스를 잘못 사용 할 경우 오히려 성능이 저하되는 역효과가 발생 할 수 있다
인덱스를 사용하면 좋은 경우
인덱스의 단점에서 살펴봤듯이 INSERT,DELETE,UPDATE가 빈번한 컬럼에 인덱스를 걸게 되면 성능이 오히려 저하되는 경우도 생긴다.
따라서 인덱스의 사용은 항상 효율적이라고 볼 수 없고, 인덱스를 사용하면 좋은 경우는 다음과 같다.
- 규모가 작지 않은 테이블
- INSERT,UPDATE,DELETE가 자주 발생하지 않는 컬럼
- JOIN이나 WHERE 또는 ORDER BY에 자주 사용되는 컬럼
- 데이터의 중복도가 낮은 컬럼
인덱스의 자료구조
인덱스를 구현하기 위해서는 여러 가지 자료구조를 사용할 수 있다. 그 중에서도 가장 대표적으로 사용되는 해시 테이블과 B+Tree에 대해 알아본다.
해시 테이블
해시 테이블은 (Key,Value)로 데이터를 저장하는 자료구조로 빠른 데이터 검색이 필요할 때 유용하다.
해시 테이블의 검색 시간복잡도는 로 매우 빠른 속도를 지원하지만, 해시 함수는 값이 1이라도 달라지면 완전히 다른 해시 값을 생성하는 특징을 가지고 있어 부등호 연산(>,<)이 자주 사용되는 데이터베이스 검색에서는 유용하지 않다.
B+Tree
B+Tree는 DB의 인덱스를 위해 자식 노드가 2개 이상인 B-Tree를 개선시킨 자료구조이다.
데이터베이스의 인덱스 컬럼은 부등호를 이용한 순차 검색 연산이 자주 발생될 수 있기 때문에 인덱스의 자료구조로 가장 많이 활용되는 자료구조이다.
면접에 나올 수 있는 질문
Q. 데이터베이스의 인덱스란?
A. 데이터베이스 테이블에 대해 검색 속도를 높여주기 위해 사용되는 자료구조이다.
Q. 인덱스를 구성하는 자료구조로는 어떤 것들이 있는가?
A. 대표적으로 해시테이블과 B+Tree가 있는데, 부등호를 이용한 연산에서 B+Tree가 더 강점이 있기 때문에 보통 B+Tree를 많이 사용한다.
Q. 여러 테이블을 기준으로 인덱스를 생성 할 수 있는가?
A. 복합 인덱스 (composite index)의 사용으로 두 개 이상의 테이블을 기준으로 인덱스를 생성 할 수 있다.
참고
기여자
Jongminfire
📦