DB

DB Index

차가운개발 2024. 10. 4. 18:16

 

인덱스는 데이터베이스에서 테이블의 데이터를 효율적으로 검색하기 위해 사용되는 자료구조다. 책의 목차를 보고 원하는 페이지를 찾아가는 거 처럼, 인덱스는 특정 열(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 성능 최적화
  • 중복방지

단점

  • 추가 저장 공간 필요
  • 쓰기 성능 저하(삽입, 삭제, 수정) 관련 인덱스도 동시에 갱신이 되어야 하므로
  • 잘못된 설계로 인한 성능 저하

 

인덱스의 설계 원칙

  • 자주 조회되는 열에 인덱스 생성
  • 카디널리티를 고려 (중복도가 낮은 열을 사용)
  • 복합 인덱스의 순서 최적화 (가장 자주 사용되는 열을 복합 인덱스의 선두에 배치)
  • 인덱스 개수 최소화 (성능에 영향을 줄 수 있음)