인덱스
인덱스(index)란?
인덱스는 데이터베이스 테이블에 대해 검색 속도를 높여주기 위해 사용되는 자료구조이다.
특정 컬럼에 인덱스를 생성하면, 해당 컬럼의 데이터를 정렬하여 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장한다.
위 사진의 경우 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. 데이터베이스의 인덱스란?
Q. 인덱스를 구성하는 자료구조로는 어떤 것들이 있는가?
Q. 여러 테이블을 기준으로 인덱스를 생성 할 수 있는가?
참고
기여자
Jongminfire
📦
