DB Index
인덱스는 데이터베이스에서 테이블의 데이터를 효율적으로 검색하기 위해 사용되는 자료구조다. 책의 목차를 보고 원하는 페이지를 찾아가는 거 처럼, 인덱스는 특정 열(Column) 또는 열 조합의 값을 기반으로 데이터의 위치를 빠르게 찾아낼 수 있게 한다. 데이터베이스에서 인덱스는 성능을 크게 좌우하는 핵심적인 요소로 적절한 설계는 데이터 조회 성능을 획기적으로 향상 시킬 수 있다.
기본 동작 원리
1. 데이터 조회 (인덱스가 없는 경우)
- 데이터베이스는 쿼리에서 조건에 해당하는 데이터를 찾기 위해 테이블의 모든 행을 처음부터 끝까지 확인하는 **Full Table Scan**을 수행해야 한다.
- 데이터의 양이 많을 수록 검색 시간이 오래 걸린다.
2. 데이터 조회 (인덱스가 있는 경우)
- 인덱스는 데이터 값을 기반으로 정렬된 구조를 유지하며, 특정 값을 빠르게 검색할 수 있게 돕는다.
- 검색 대상 데이터의 물리적 위치를 바로 찾아갈 수 있으므로 쿼리 성능이 크게 향상 된다.
인덱스의 자료 구조
인덱스는 데이터의 정렬과 검색 속도를 최적화 하기 위해 특정 자료구조를 사용한다. 주로 사용하는 자료구조에 대해 설명한다.
1. B-Tree
데이터 베이스 인덱스에서 가장 널리 사용되는 자료 구조
구조
- 트리의 각 노드에 여러 키(Key)를 저장하며, 각 키는 자식 노드를 가리키는 포인터를 포함한다.
- 모든 리프 노드가 동일한 깊이에 있는 균형트리, 트리의 높이를 일정하게 유지한다.
- 데이터는 정렬된 상태로 저장되어 있어 범위 검색이 용이하다.
특징
- O(log N)의 시간 복잡도로 검색, 삽입, 삭제가 가능하다.
- 루트에서 리프 노드까지의 경로가 짧아, 대량의 데이터에서도 빠른 검색이 가능하다.
- 리프 노드에는 인덱스 키와 실제 데이터의 위치(포인터)가 저장된다.
B+tree
B-Tree의 변형으로 리프 노드에 모든 데이터를 저장하고, 리프 노드끼리 연결 리스트 형태로 연결한다.
범위 쿼리에 더욱 효율적이다
장점
- 정렬된 데이터로 인해 범위 검색 (Between, <, >)에 적합
- 대규모 데이터에서 빠른 검색 성능 보장
단점
데이터 삽입/삭제시 트리의 균형을 유지하기 위해 재배치 작업이 발생 오버헤드가 추가될 수 있다.
2. 해시 기반 인덱스
데이터의 키를 해시 함수를 사용하여 특정 위치로 매핑하는 방식이다.
구조
- 키 값에 대해 해시 함수를 적용하여 데이터가 저장될 버킷(해시 함수의 결과로 계산된 저장 공간)을 계산한다.
- 검색, 삽입, 삭제가 O(1)의 시간 복잡도로 매우 빠르게 수행된다.
특징
- 특정 값을 정확히 매칭하는 검색에 뛰어난 성능을 보인다
- 데이터가 정렬되지 않으므로 범위 검색이나 정렬된 결과를 반환하는데 적합하지 않다
- 키 값의 분포가 고르지 않을 경우 해시 충돌 문제가 발생할 수 있다.
장점
- 정확한 키 검색 ( = ) 에서 매우 빠름
- 데이터 크기와 관계 없이 일정한 검색 성능 제공
단점
- 범위 검색이나 정렬 작업에 적합하지 않음
- 해시 충돌이 빈번하게 발생하면 성능 저하
인덱스의 종류
1. 클러스터 인덱스
- 테이블의 데이터가 물리적으로 정렬된 상태로 저장된다.
- 클러스터 인덱스의 리프 노드는 실제 데이터 행을 포함한다.
- 하나의 테이블에 하나만 생성 가능하며, 주로 기본 키에 적용된다.
2. 넌클러스터 인덱스
- 인덱스는 데이터와 분리된 별도의 구조에 저장되며, 데이터 행의 위치를 포함한다
- 하나의 테이블에 여러 개의 넌클러스터 인덱스를 생성할 수 있다
- 복잡한 쿼리를 처리하기 위해 특정 열에 대해 추가적인 인덱스를 생성할 때 사용된다
3. 유니크 인덱스
열 값이 중복되지 않도록 보장한다, 기본 키나 유니크 키를 만들 때 자동으로 생성되기도 한다.
4. 복합 인덱스
두 개 이상의 열을 결합하여 생성한 인덱스, 주로 WHERE 절에 여러 열이 동시에 사용되는 경우 성능을 최적화한다.
5. Full-Text Index
텍스트 데이터에서 특정 단어를 검색하거나, 부문 문자열 검색을 최적화한다.
6. 함수 기반 인덱스 (Function-Based Index)
열의 값에 특정 함수를 적용하여 인덱스를 생성
인덱스의 장단점
장점
- 데이터 검색 속도 향상
- 범위 검색에 효율적
- JOIN 및 ORDER BY 성능 최적화
- 중복방지
단점
- 추가 저장 공간 필요
- 쓰기 성능 저하(삽입, 삭제, 수정) 관련 인덱스도 동시에 갱신이 되어야 하므로
- 잘못된 설계로 인한 성능 저하
인덱스의 설계 원칙
- 자주 조회되는 열에 인덱스 생성
- 카디널리티를 고려 (중복도가 낮은 열을 사용)
- 복합 인덱스의 순서 최적화 (가장 자주 사용되는 열을 복합 인덱스의 선두에 배치)
- 인덱스 개수 최소화 (성능에 영향을 줄 수 있음)