상세 컨텐츠

본문 제목

[데이터베이스 CS지식] 데이터베이스 인덱스에 대해

데이터베이스

by 소란한소란 2024. 2. 16. 15:41

본문

728x90

데이터베이스의 핵심: 다양한 인덱스로 속도를 높이다

안녕하세요! 이번 블로그에서는 데이터베이스에서 검색 속도를 향상시키는 중요한 개념 중 하나인 "인덱스"에 대해 자세히 알아보겠습니다. 인덱스는 특정 테이블의 행을 저장하여 데이터 검색 속도를 향상시키는 데 사용되는 데이터베이스 객체입니다. 마치 책의 목차가 페이지를 찾아가는 데 도움이 되는 것과 유사한 역할을 합니다.


인덱스의 개념

인덱스는 데이터베이스 테이블의 특정 열(또는 열의 조합)에 대한 정렬된 키의 세트입니다. 이를 통해 데이터베이스 엔진은 특정 데이터를 빠르게 찾을 수 있어 검색 속도가 향상됩니다. 그러나 이로 인해 공간과 쓰기 작업에 대한 오버헤드가 발생할 수 있으므로 신중한 사용이 필요합니다.


인덱스의 목적

  • 검색 속도 향상: 특정 열을 기반으로 데이터를 검색할 때 인덱스를 사용하면 선형 검색보다 훨씬 빠른 검색이 가능합니다.
  • 정렬: 데이터가 특정 순서로 정렬되어 저장되므로 정렬된 결과를 빠르게 얻을 수 있습니다.
  • 고유성 강제: 고유해야 하는 열에 대한 인덱스를 생성하여 중복을 방지하고 데이터 무결성을 유지할 수 있습니다.
  • 조인 성능 향상: 여러 테이블 간의 조인 작업에서 인덱스를 사용하면 성능이 향상될 수 있습니다.

B-Tree 기반의 인덱스

인덱스는 B-Tree 기반의 균형 트리입니다. 균형 트리는 Root 블록, Branch 블록, 그리고 Leaf 블록으로 구성되어 있어 모든 Leaf 블록이 동일한 깊이를 유지합니다. 이로써 데이터 검색은 최대 깊이 아래에서 이루어지므로 검색 속도를 보장할 수 있습니다. RDBMS에서는 B-Tree가 채택되어 데이터베이스의 효율적인 관리가 가능해졌습니다.

 

 

Leaf 블록에는 주황색 선이 있어 가로로 검색이 가능하므로 루트부터 매번 검색할 필요가 없어지면서 인덱스가 존재할 때의 속도가 상당히 향상됩니다.


인덱스의 종류

 

고유성

  • 고유 인덱스 (Unique Index): 해당 테이블의 한 행만 가리키는 인덱스 키
  • 비고유 인덱스 (Non-Unique Index): 해당 테이블의 여러 행을 가리킬 수 있는 인덱스 키

열 구성 수

  • 단일 인덱스 (Single Index): 하나의 열로 구성된 인덱스
  • 복합 인덱스 (Composite Index): 여러 열을 결합하여 생성된 인덱스 (최대 32개까지)

클러스터링

  • 클러스터드 인덱스 (Clustered Index): 데이터 레코드의 순서가 인덱스 페이지의 정렬 순서와 같거나 유사한 인덱스.-
  • 논클러스터드 인덱스 (Non-Clustered Index): 데이터 레코드의 물리적인 순서와 상관없이 인덱스 엔트리 순서로 저장된 인덱스

함수

  • 함수 기반 인덱스 (Function-Based Index): 열에 함수나 식의 계산값을 적용하여 생성된 인덱스

기타

  • 비트맵 인덱스 (Bitmap Index): 비트를 사용하여 열 값을 저장하고 ROWID를 자동으로 생성하는 인덱스
  • 리버스 키 인덱스 (Reverse Key Index): 인덱스 열의 순서를 유지하면서 각 바이트의 위치를 역순으로 저장
  • ROWID: 행을 식별하는 데 사용되는 물리적인 주소 정보

인덱스 스캔의 다양한 방법

  • 인덱스 풀 스캔 (Index Full Scan): 전체 인덱스를 검색하는 방법
  • 인덱스 패스트 풀 스캔 (Index Fast Full Scan): 인덱스 블록만 스캔하여 원하는 데이터를 검색하는 방법
  • 인덱스 스킵 스캔 (Index Skip Scan): 복합 인덱스의 전제 조건이 없고 후행 열에 대한 조건만 있는 경우 사용
  • 함수 기반 인덱스 (Function-Based Index): 열에 함수를 적용하여 생성된 인덱스
  • 비트맵 인덱스 (Bitmap Index): 비트 값을 사용하여 열 값을 저장하고 ROWID를 자동으로 생성

인덱스 설계의 핵심

  • 항상 또는 자주 사용되는 조건절에 사용되는 열을 선택합니다.
  • '=' 조건을 사용하여 자주 검색되는 열을 앞에 배치합니다.
  • 분포가 좋은 열을 선택합니다 (15% 내외)
  • 인덱스 선택 및 순서에 따라 검색이 수행되므로 신중하게 생성합니다.

인덱스 설계의 단계

인덱스 설계는 크게 세 가지 단계로 이루어집니다.

  1. 접근 경로 수집:
    • 반복 액세스 경로: 조인 열
    • 분포가 좋은 열
    • 검색 조건에 사용되는 열
    • 자주 결합되는 열
    • 데이터 정렬 및 그룹화 열
    • 일련 번호가 지정된 열
    • 통계 데이터 추출 조건 또는 결합 조건 연산자
  2. 분포 차트를 기반으로 한 후보 열 선택:
    • 10~15% 분포 권장
    • 분포 (%) = 각 데이터의 평균 수 / 테이블 전체 행 수
  3. 열 조합 및 순서 결정:
    • 항상 리드 열로 사용될 열 선택
    • '=' 조건을 사용하는 열을 선행 열로 선택
    • ORDER BY, GROUP BY 순서 적용

인덱스는 데이터베이스 성능을 향상시키기 위한 필수적인 구성 요소입니다. 따라서 신중한 설계와 지속적인 관리가 필요하며, 실제 환경에서의 사용에 따라 최적화가 이루어져야 합니다.


인덱스의 효과적인 활용

인덱스는 신중하게 설계되고 사용되어야 합니다. 적절한 열을 선택하고, 데이터의 변경 빈도를 고려하여 효과적인 인덱스를 구현하는 것이 중요합니다. 과도한 인덱스는 오버헤드를 초래할 수 있으므로 실제 필요성에 기반하여 구성해야 합니다.


이번 포스트에서는 데이터베이스 인덱스에 대한 기본 개념과 목적, 종류 등을 살펴보았습니다. 데이터베이스 성능 최적화를 위해 인덱스를 효과적으로 활용하는 것은 중요한 과제 중 하나입니다. 더 나은 데이터베이스 설계와 최적화를 위해 계속해서 학습하고 실험해보시기를 권장합니다. 감사합니다!

 

 

 

728x90

관련글 더보기