Akashic Records

인덱스(Index)란 무엇인가? 본문

Database Learning Guide

인덱스(Index)란 무엇인가?

Andrew's Akashic Records 2023. 9. 19. 10:31
728x90

인덱스(Index)는 데이터베이스에서 검색 속도를 향상시키기 위한 데이터 구조입니다. 데이터베이스 테이블의 열(컬럼)에 대한 인덱스를 생성하면 데이터베이스 시스템은 검색 및 정렬 작업을 더 효율적으로 수행할 수 있습니다. 인덱스는 주로 다음과 같은 목적으로 사용됩니다:

 

  1. 검색 속도 향상: 인덱스를 사용하면 특정 값을 검색할 때 해당 값을 가진 행을 빠르게 찾을 수 있습니다. 인덱스는 데이터베이스 엔진이 검색을 더 빠르게 수행할 수 있도록 도와줍니다.

  2. 정렬: 인덱스는 데이터를 정렬된 순서로 저장하므로 정렬된 결과를 얻는 데 효율적입니다. 이를 통해 정렬된 결과를 반환하는 쿼리의 성능을 향상시킬 수 있습니다.

  3. 중복 방지: 고유(unique) 인덱스를 사용하면 열의 중복 값을 방지할 수 있습니다. 이를 통해 데이터의 일관성을 유지하고 중복된 데이터 입력을 방지할 수 있습니다.

인덱스는 일반적으로 B-트리(B-tree)와 같은 트리 구조로 구현되며, 열의 값을 키로 사용하여 트리를 구성합니다. 이렇게 구성된 트리는 이진 검색을 사용하여 데이터를 빠르게 찾을 수 있게 합니다.

 

하지만 인덱스를 사용하는 것은 데이터의 검색 속도를 향상시키는 동시에 삽입, 삭제, 업데이트 작업에 대한 오버헤드를 초래할 수 있습니다. 따라서 인덱스를 적절하게 설계하고 사용하는 것이 중요하며, 데이터베이스의 사용 패턴 및 성능 목표에 따라 어떤 열에 인덱스를 생성할지 결정해야 합니다.

 

데이터베이스에서 사용되는 주요 인덱스 유형은 다음과 같습니다. 각 인덱스 유형은 특정 사용 사례와 성능 요구 사항을 지원하기 위해 설계되었습니다.

  1. 단일 열 인덱스 (Single-Column Index):
    • 하나의 열(컬럼)에 대한 인덱스입니다.
    • 가장 일반적인 인덱스 유형으로, 주로 단일 열을 검색하거나 정렬하는 데 사용됩니다.
    • 열의 중복을 허용하거나 방지하는 고유(unique) 인덱스도 여기에 속합니다.
  2. 복합 인덱스 (Composite Index):
    • 두 개 이상의 열을 조합하여 생성되는 인덱스로, 여러 열에 대한 검색 및 정렬 작업에 사용됩니다.
    • 예를 들어, "A 열"과 "B 열"의 값을 동시에 고려하여 검색 또는 정렬하는 경우, ("A 열", "B 열")과 같이 두 개의 열을 조합한 복합 인덱스를 사용할 수 있습니다.
  3. 고유 인덱스 (Unique Index):
    • 해당 인덱스 열의 중복 값을 방지하는 인덱스입니다. 각 값은 테이블 내에서 고유해야 합니다.
    • 주로 기본 키(primary key) 또는 고유한 값이어야 하는 열에 사용됩니다.
  4. 클러스터 인덱스 (Clustered Index):
    • 데이터 행의 물리적 순서를 변경하는 인덱스로, 테이블당 하나의 클러스터 인덱스만 가질 수 있습니다.
    • 클러스터 인덱스를 사용하면 행을 검색할 때 빠른 성능을 제공하며 테이블의 물리적 구조를 변경합니다.
  5. 논클러스터 인덱스 (Non-Clustered Index):
    • 행의 물리적 순서를 변경하지 않고 데이터를 정렬하는 인덱스입니다.
    • 주로 단일 열 또는 복합 열에 대한 검색 및 정렬 작업에 사용됩니다.
  6. 비트맵 인덱스 (Bitmap Index):
    • 열의 이진 비트 패턴을 사용하여 데이터를 인덱싱합니다.
    • 대량의 데이터에 대한 필터링 및 분류 작업에 유용하며, 데이터의 카디널리티(중복되지 않는 값의 수)가 낮을 때 효과적입니다.
  7. 공간 인덱스 (Spatial Index):
    • 공간 데이터 형식(GIS 데이터)의 열에 대한 검색을 지원하는 인덱스입니다. 지리 정보 시스템(GIS)에서 사용됩니다.
  8. 전체 텍스트 인덱스 (Full-Text Index):
    • 텍스트 열에서 특정 단어나 문구를 검색하는 데 사용됩니다. 대용량 텍스트 데이터 검색에 유용합니다.

인덱스를 선택할 때는 데이터베이스의 사용 패턴과 성능 요구 사항을 고려해야 합니다. 특정 쿼리의 최적화를 위해 어떤 열에 인덱스를 생성할지 결정하고, 필요한 경우 여러 인덱스를 함께 사용할 수도 있습니다.

 

인덱스 컬럼을 선택하는 것은 데이터베이스 설계와 성능 튜닝에서 매우 중요한 결정입니다. 올바른 인덱스 컬럼을 선택하면 데이터베이스의 성능을 향상시킬 수 있지만, 잘못된 선택은 오히려 성능을 저하시킬 수 있습니다. 인덱스 컬럼을 선정할 때 다음과 같은 고려 사항을 고려해야 합니다:

  1. 쿼리 패턴 분석: 어떤 종류의 쿼리가 자주 실행되는지 이해하십시오. 어떤 열이 자주 검색 조건이나 정렬 기준으로 사용되는지 확인하십시오.

  2. 중요한 열: 어떤 열이 중요한지 결정하십시오. 중요한 열은 인덱스로 선택할 가치가 있습니다.

  3. 카디널리티 분석: 열의 카디널리티(중복되지 않는 값의 수)를 고려하십시오. 카디널리티가 높은 열일수록 인덱스의 효과가 높을 가능성이 있습니다.

  4. 조인 조건: 테이블 간의 조인 조건에 어떤 열이 사용되는지 고려하십시오. 조인 시 자주 사용되는 열을 인덱스로 선택하면 조인 성능이 향상될 수 있습니다.

  5. 쿼리 성능 향상: 특정 쿼리의 성능을 개선하기 위해 필요한 열을 선택하십시오. 쿼리의 WHERE 절, ORDER BY 절 등을 고려하십시오.

  6. 저장 공간 고려: 인덱스는 저장 공간을 차지하므로 필요한 열만 인덱스로 선택하여 저장 공간을 절약하십시오.

  7. 업데이트 및 삽입 오버헤드: 인덱스를 업데이트하려면 관련된 모든 인덱스를 업데이트해야 합니다. 자주 업데이트되는 열을 인덱스로 선택하면 업데이트 작업에 대한 오버헤드가 발생할 수 있습니다.

  8. 종합적인 설계: 종합적으로 고려하여 어떤 열을 인덱스로 선택할지 결정하십시오. 필요한 경우 여러 인덱스를 함께 사용할 수 있습니다.

인덱스를 선택할 때는 데이터베이스의 사용 패턴과 성능 목표를 고려하며, 테스트와 모니터링을 통해 인덱스의 성능을 지속적으로 평가하고 조정해야 합니다.

 

인덱스가 사용되지 않는 경우 다음과 같은 상황이 발생할 수 있습니다:

  1. 인덱스 미생성: 해당 열에 대한 인덱스가 아직 생성되지 않은 경우, 인덱스를 생성해야 합니다. 쿼리가 자주 실행되는 열에 대한 인덱스가 없으면 검색 속도가 느려질 수 있습니다.

  2. 쿼리 최적화: 데이터베이스 옵티마이저가 인덱스를 사용하는 것이 쿼리 최적화에 불리한 경우가 있을 수 있습니다. 이는 데이터베이스 설계 및 쿼리 작성에 따라 다를 수 있습니다.

  3. 인덱스 힌트 누락: 데이터베이스 쿼리에서 인덱스를 사용하도록 명시적으로 지시하지 않은 경우 (인덱스 힌트를 누락한 경우),  옵티마이저가 인덱스를 무시하고 풀 스캔 또는 다른 접근 방식을 선택할 수 있습니다.

  4. 데이터베이스 통계 부정확성: 데이터베이스 통계가 부정확하게 수집되거나 오래된 경우, 옵티마이저가 인덱스를 사용하지 않을 수 있습니다. 통계를 업데이트하고 최적화를 수행해야 합니다.

  5. 조건 분포 및 카디널리티: 인덱스 컬럼의 조건 분포가 너무 넓거나 카디널리티(중복되지 않는 값의 수)가 너무 낮은 경우, 옵티마이저가 인덱스를 사용하지 않을 수 있습니다.

  6. 조인 및 복잡한 쿼리: 조인이나 복잡한 쿼리의 경우, 인덱스를 최적으로 활용하기 어려울 수 있으며, 대신 전체 테이블 스캔 등 다른 방법을 사용할 수 있습니다.

  7. 특정 열을 필요로 하지 않는 경우: 쿼리에서 특정 열을 필요로 하지 않는 경우, 해당 열에 대한 인덱스를 사용하지 않을 수 있습니다.

인덱스를 사용하지 않는 경우에는 인덱스를 생성하고, 옵티마이저를 최적화하고, 데이터베이스의 통계를 유지하고 업데이트하여 인덱스를 활용할 수 있도록 해야 합니다. 또한 쿼리 작성과 최적화 과정에서 인덱스를 활용할 수 있는 방법을 고려해야 합니다.

Oracle 데이터베이스에서 인덱스를 만들 때, 몇 가지 중요한 고려 사항을 고려해야 합니다. 아래는 Oracle 인덱스를 만들 때 유용한 몇 가지 팁과 고려 사항입니다:

  1. 인덱스 대상을 신중하게 선택하십시오: 인덱스를 만들 때 어떤 열(컬럼)을 인덱스 대상으로 선택하는 것이 중요합니다. 자주 검색되는 열이나 조건으로 사용되는 열에 인덱스를 만드는 것이 좋습니다. 그러나 너무 많은 인덱스를 만들면 성능 저하의 원인이 될 수 있으므로 신중하게 선택해야 합니다.

  2. 복합 인덱스를 고려하십시오: 여러 열의 조합에 대한 검색이 필요한 경우, 복합 인덱스를 고려할 수 있습니다. 이렇게 하면 여러 열의 값을 조합하여 빠르게 검색할 수 있습니다.

  3. 인덱스 키의 크기를 최소화하십시오: 인덱스의 키 크기를 최소화하여 디스크 공간을 절약하고 검색 속도를 향상시킬 수 있습니다. 필요한 만큼의 열만 포함하고 크기를 최소한으로 유지하십시오.

  4. 인덱스 컬럼의 정렬을 고려하십시오: 인덱스의 정렬 순서를 고려하여 검색 속도를 최적화할 수 있습니다. 오름차순(ASC) 또는 내림차순(DESC)으로 정렬하는 것을 고려하십시오.

  5. 인덱스를 주기적으로 유지하십시오: 데이터베이스가 변경될 때 인덱스도 업데이트되어야 합니다. 주기적으로 인덱스를 재구성하거나 통계를 업데이트하여 최적의 성능을 유지하십시오.

  6. 인덱스 힌트를 사용하십시오: 필요한 경우 쿼리에 힌트를 추가하여 특정 인덱스를 사용하도록 유도할 수 있습니다. 그러나 힌트를 남용하지 않도록 주의하십시오.

  7. 인덱스의 크기를 모니터링하십시오: 인덱스는 디스크 공간을 차지하므로 인덱스 크기를 모니터링하고 필요하지 않은 인덱스를 정리하십시오.

  8. 인덱스를 생성할 때 온라인으로 생성하십시오: 큰 테이블에 인덱스를 추가할 때 온라인으로 생성하면 다른 작업에 영향을 미치지 않고 인덱스를 생성할 수 있습니다.

  9. 실행 계획을 분석하고 최적화하십시오: 쿼리 실행 계획을 확인하고 인덱스를 사용하도록 쿼리를 최적화하십시오.

  10. 적절한 인덱스 이름을 사용하십시오: 의미 있는 이름을 가진 인덱스를 만들어서 유지 및 관리하기가 더 쉽습니다.

인덱스를 올바르게 사용하면 데이터베이스의 성능을 향상시킬 수 있지만, 부적절하게 사용하면 오히려 성능에 부정적인 영향을 미칠 수 있으므로 신중하게 계획하고 구현해야 합니다.

 

복합 인덱스(Composite Index)는 데이터베이스에서 두 개 이상의 열(컬럼)을 조합하여 하나의 인덱스를 생성하는 것을 말합니다. 이러한 인덱스는 여러 열을 함께 고려하여 데이터를 검색하거나 정렬하는 데 사용됩니다. 복합 인덱스는 단일 열 인덱스보다 데이터베이스 성능을 최적화하는 데 도움이 될 수 있습니다.


복합 인덱스의 주요 특징은 다음과 같습니다:

  1. 여러 열을 조합한 인덱스: 복합 인덱스는 두 개 이상의 열을 조합하여 생성되며, 이 열들은 데이터의 유용한 조합을 나타내는 경우에 선택됩니다.

  2. 조회 및 정렬 성능 향상: 복합 인덱스를 사용하면 여러 열의 값을 조합하여 검색 또는 정렬하는 경우 효율적인 성능을 얻을 수 있습니다. 예를 들어, 주문 테이블에서 "고객 ID"와 "주문 일자" 열을 조합한 복합 인덱스를 사용하면 특정 고객의 특정 일자 범위 내 주문을 빠르게 검색할 수 있습니다.

  3. 인덱스 크기 증가: 복합 인덱스는 단일 열 인덱스보다 크기가 크기 때문에 저장 공간을 더 사용합니다. 그러나 이러한 공간 비용은 성능 개선으로 상쇄될 수 있습니다.

  4. 조건에 따른 인덱스 사용: 복합 인덱스를 사용하여 여러 열에 대한 조건을 쿼리할 수 있습니다. 이는 복합 인덱스의 첫 번째 열로 조회하거나 범위 조건으로 활용할 수 있습니다.

복합 인덱스는 특정한 데이터베이스 사용 사례에 따라 유용할 수 있으며, 데이터베이스 설계자가 어떤 열을 조합하여 인덱스를 생성할지 결정할 때 성능과 공간 사용량을 고려해야 합니다.

 

복합 인덱스의 열이 많은 경우 몇 가지 고려해야 할 사항이 있습니다. 복합 인덱스를 구성할 때 열의 수가 증가하면 성능과 관리 측면에서 고려해야 할 점들이 더 많아집니다. 아래는 복합 인덱스의 열이 많은 경우에 대한 주요 고려 사항입니다:

  1. 검색 및 정렬 성능: 복합 인덱스는 여러 열의 값을 고려하기 때문에 특정 검색 또는 정렬 작업에서 더 높은 성능을 제공할 수 있습니다. 그러나 열의 수가 증가하면 인덱스의 크기도 커지며, 일부 검색 및 정렬 작업에서는 추가적인 I/O 및 처리 비용이 발생할 수 있습니다.

  2. 인덱스 크기와 저장 공간: 복합 인덱스는 열의 수에 비례하여 크기가 증가하므로 저장 공간을 더 많이 사용합니다. 따라서 데이터베이스 서버의 디스크 공간을 고려하여 복합 인덱스를 설계해야 합니다.

  3. 업데이트 및 삽입 오버헤드: 복합 인덱스에 포함된 열 중 하나라도 업데이트되면 인덱스도 업데이트되어야 합니다. 열의 수가 많으면 인덱스 업데이트에 따른 오버헤드가 증가할 수 있습니다.

  4. 인덱스 유지 관리: 복합 인덱스를 유지 관리할 때 인덱스의 통계 정보도 업데이트해야 합니다. 이를 통해 옵티마이저가 효율적인 실행 계획을 선택할 수 있습니다.

  5. 쿼리 최적화: 복합 인덱스를 사용하는 쿼리를 최적화하는 것이 중요합니다. 열의 순서, 검색 및 정렬 조건 등을 고려하여 쿼리를 작성하고 인덱스를 설계해야 합니다.

  6. 유지 관리 복잡성: 복합 인덱스의 열이 많을수록 인덱스의 복잡성도 증가합니다. 따라서 인덱스를 관리하고 유지하기 위해 시간과 노력을 투자해야 합니다.

복합 인덱스를 설계할 때에는 데이터베이스의 특정 요구 사항과 성능 목표를 고려하여 적절한 열을 선택하고 열의 순서를 결정해야 합니다. 불필요한 열을 포함하지 않고 필요한 열을 포함하여 효율적인 인덱스를 만드는 것이 중요합니다.

728x90

'Database Learning Guide' 카테고리의 다른 글

데이터베이스 마이그레이션(Database Migration)  (0) 2023.06.27
아카이브 로그 백업(RMAN)  (0) 2023.05.23
SQL CASE 문장  (0) 2023.05.23
Database 그룹함수  (0) 2023.05.18
DataBase Join의 종류와 그 구조  (0) 2023.05.18
Comments