DB Index
Index?
- 찾고 싶은 데이터를 찾을 경우, 그에 해당되는 범위에서 데이터를 찾아내는 것이 빠르다. (ex, 사전을 찾을때와 같이)
DB에서 레인지 스캔을 하려면 이와 같이 목차가 필요한데 이것을 인덱스라고 부른다. 만일 이러한 인덱스가 없을 경우 사용자가 요청시 컴퓨터는 어마어마한 양의 데이터를 처음부터 끝까지 둘러보고 찾아내기에 속도가 느려질 수 밖에 없다.
따라서 인덱스는 데이터베이스의 성능을 향상시키는데 중요한 역할을 한다.
- 한 테이블에서는 여러개의 index 설정이 가능하다. 하지만 인덱스가 너무 많을 경우 새로운 Row를 추가할 때마다 인덱스 값또한 추가해주어야 하기에 한 테이블에 index는 3~4 정도가 적당하다.
인덱스에는 다양한 종류가 있으며 주로 사용되는 인덱스의 종류는 B-트리 인덱스, 해시 인덱스, 클러스터드 인덱스가 있다.
B-tree 인덱스
- B-tree 인덱스는 가장 일반적으로 사용되는 인덱스의 종류이며, 데이터베이스에서 기본적으로 제공된다. B-tree 인덱스는 데이터의 정렬 순서를 유지하며, 범위 검색과 정렬된 결과 반환에 효율적이다.
- B-tree는 최대 2개의 자식 노드만을 지니는 이진검색트리를 일반화하여 2개 이상의 자식 노드를 지닐 수 있도록 확장한 균형 트리이다.
- 예시로, A, B, C 라는 3가지 컬럼을 가지는 테이블에서 A 컬럼에 대하여 B 트리 인덱스를 생성할 경우, 기본적으로 각 노드들에는 복수의 A 컬럼 값들이 인덱스 키로써 정렬되어 관리된다.
- B 트리 기반 인덱스는 값들이 정렬되어 있기 때문에 =, >, >=, <, <=, BETWEEN 등의 문법과 함께 활용하여 동일 조건과 범위 조건에 대한 겁색 성능을 높일 수 있다. 이때 B 트리는 꾸준히 균형이 유지되므로 데이터 조회, 생성, 삭제시 O(log N)의 시간복잡도를 유지한다.
B 트리 인덱스로 관리하는 컬럼의 데이터의 크기가 너무 클 경우 인덱스를 사용하더라고 성능이 떨어질 수 있다. 컬럼 데이터의 크기가 너무 커지면 하나의 페이지에 담을 수 있는 컬럼 데이터의 개수가 갑소하고, 자연스럽게 각 노드의 자녀 노드 개수는 감소하고, 전체적으로 노드의 개수가 증가하며, 트리의 높이도 같이 커진다.
그렇기에 검색 과정에서 하나의 페이지만으로 처리가 안된다면 다른 페이지를 디스크에서 읽어와 메모리에 올려야 한다. 이러한 디스크 I/O로 인해 일차적으로 성능이 떨어진다. 또한 개별 데이터 크기의 증가로 페이지 자체의 크기가 커지면서 메모리에 캐싱해둘 수 있는 페이지 수도 줄어들고 이로 인하여 메모리를 효율적으로 사용하지 못하게 될 수 있다.
그렇기에 가급적 B 트리 인덱스를 사용하는 컬럼은 최대한 작게 유지하는 것이 좋다.
'IT' 카테고리의 다른 글
서블릿(Servlet) - 쿠키, 세션 연동 (0) | 2024.08.15 |
---|---|
서블릿(Servlet) - forward, 바인딩 (0) | 2024.08.15 |
REST API (0) | 2024.07.28 |
Apache, Tomcat, NginX (0) | 2024.07.27 |
객체지향 디자인 패턴 - command, adapter, proxy pattern (2) | 2024.07.21 |