인덱스 (데이터베이스)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
인덱스(데이터베이스)는 데이터베이스 시스템에서 데이터 검색 속도를 향상시키기 위해 사용되는 자료 구조를 의미한다. 인덱스는 다양한 종류가 있으며, 비트맵 인덱스, 클러스터형 인덱스, 비클러스터형 인덱스 등이 존재한다. 인덱스는 B-트리, 해시 테이블 등 다양한 데이터 구조를 사용하여 구현되며, 데이터베이스 제약 조건 관리 및 빠른 조회를 위한 지원에 활용된다. 인덱스 정의 시 열의 순서는 검색 효율에 영향을 미치며, 커버링 인덱스는 쿼리에 필요한 모든 열을 포함하여 데이터 파일에 접근하지 않고 쿼리 결과를 얻을 수 있는 특별한 형태의 인덱스이다. 인덱스는 동시성 제어 및 다양한 응용 분야에 사용되지만, 와일드카드 검색 등 특정 상황에서는 사용에 제한이 있을 수 있다.
더 읽어볼만한 페이지
- 데이터베이스 관리 시스템 - 트랜잭션 처리
트랜잭션 처리는 데이터베이스 시스템에서 데이터의 일관성과 무결성을 보장하기 위한 기술이며, ACID 속성을 통해 데이터 정확성을 유지하고 롤백, 데드락 처리 등의 기술을 활용한다. - 데이터베이스 관리 시스템 - 저장 프로시저
저장 프로시저는 데이터베이스 관리 시스템에서 SQL 문들을 미리 컴파일하여 저장하고, 모듈화, 보안성, 성능 향상, 유지보수 용이성과 같은 특징을 가지며, 데이터베이스 시스템마다 구현 방식과 지원하는 언어가 다를 수 있는 코드 묶음이다. - 데이터베이스 - 지식 베이스
지식 베이스는 특정 주제 정보를 체계적으로 저장 및 관리하며 규칙 기반 추론으로 새로운 지식 도출에 활용되고, 웹 콘텐츠 관리 및 지식 관리 시스템으로 확장되어 온톨로지를 이용, 인공지능 기술과 결합하여 문제 해결책을 제시하고 경험을 통해 학습하는 시스템이다. - 데이터베이스 - 화이트리스트
화이트리스트는 특정 대상만 허용하고 나머지는 차단하는 접근 제어 목록으로, 정보보안, 무역, 금융 등 다양한 분야에서 활용되지만, 목록 선정 기준의 불명확성, 사회적 문제점 등의 위험성으로 투명하고 엄격한 관리가 필요하다. - 데이터 관리 - 데이터 센터
데이터센터는 컴퓨터 시스템 및 관련 장비와 지원 인프라를 수용하는 시설로, 기술 발전에 따라 규모와 중요성이 확대되었으며, 에너지 효율과 보안을 고려하여 설계 및 운영되고, TIA-942 표준에 따른 티어 분류와 친환경 기술 도입이 이루어지고 있다. - 데이터 관리 - 정보 아키텍처
정보 아키텍처는 정보 시스템 및 정보 기술 분야에서 공유 정보 환경의 구조적 설계를 의미하며, 웹사이트, 소프트웨어 등의 구성과 레이블링을 포함하여 검색 용이성과 사용성을 지원하고, 도서관정보학에 기원을 두고 있다.
인덱스 (데이터베이스) | |
---|---|
개요 | |
종류 | 자료 구조 |
분야 | 데이터베이스 |
목적 | 데이터 검색 성능 향상 |
상세 정보 | |
작동 방식 | 데이터베이스 테이블의 열에 대해 생성됨 테이블의 모든 행에 대해 생성될 필요는 없음 데이터 정렬 상태를 유지하는 자료 구조 |
주요 특징 | 테이블의 데이터를 빠르게 찾을 수 있음 데이터베이스에서 데이터를 검색하는 데 필요한 시간 단축 |
장점 | 검색 속도 향상 질의 성능 향상 |
단점 | 추가적인 저장 공간 필요 데이터 삽입, 수정, 삭제 시 오버헤드 발생 |
고려 사항 | |
고려 사항 | 인덱스를 너무 많이 생성하면 데이터베이스 성능 저하 가능 읽기 작업의 속도를 높이지만 쓰기 작업의 속도를 늦춤 |
대안 | 파티셔닝 클러스터링 |
예시 | |
사용 예시 | ISBN으로 책을 검색 전화번호부에서 이름을 검색 |
구현 | |
구현 방법 | 다양한 자료 구조를 사용하여 구현 가능 (예: B-트리) |
기타 | |
관련 개념 | 데이터베이스 쿼리 옵티마이저 |
2. 역사적 배경
인덱스는 테이블 내 하나 이상의 열을 대상으로 생성되며, 무작위 참조 처리나 특정 순서로 레코드 접근 효율을 높일 수 있다. 인덱스는 일반적으로 행 전체를 효율적으로 가져올 수 있도록, 원본 데이터의 원본 행에 대한 "키" 또는 직접 링크를 포함한다.
인덱스는 테이블 내 하나 이상의 열을 대상으로 생성되며, 무작위 참조 처리나 특정 순서로 레코드를 찾는 효율을 높일 수 있다. 데이터베이스에 따라 식 인덱스, 부분 인덱스 등 다양한 인덱스 생성 기능을 제공한다.
데이터베이스에 따라 인덱스 생성 기능을 확장하여, 개발자가 함수나 식에 의한 계산 열 값에 인덱스를 생성하는 식 인덱스라는 메커니즘을 채택하기도 한다. `upper(last_name)`에 인덱스를 생성하면 `last_name` 필드의 대문자 버전만 인덱스에 저장된다. 사용자 정의 함수, 내장 함수에 의한 계산 열 값에 인덱스를 생성할 수 있는 시스템도 있다. 이 외에도, 어떤 조건식을 만족하는 일부 레코드에 대해서만 인덱스를 생성하는 부분 인덱스라는 메커니즘도 있다.
인덱스에는 테이블 내 키 열만 포함되지만, 테이블에는 키 열 이외의 데이터도 포함되므로, 일반적으로 인덱스가 차지하는 저장 용량은 대상이 되는 테이블보다 적다. 따라서 전체를 메모리에 모두 보관할 수 없을 정도로 큰 테이블이라도, 해당 인덱스라면 메모리에 보관할 수 있을 가능성이 있다.
3. 종류
인덱스는 균형 이진 탐색 트리, B+ 트리, 해시 등 다양한 데이터 구조를 사용하여 구현된다. 검색 요구 사항에 따라 필요한 인덱스 구조가 다르므로, 여러 종류의 인덱스를 제공하는 데이터베이스 제품도 있다.
일반적인 인덱스는 한 행이 하나의 키만 갖는 것을 전제로 하지만, 배열 요소 검색이나 전체 텍스트 검색처럼 한 행에서 여러 키가 추출되는 경우도 있다. 이러한 경우에는 '''전치 인덱스'''(영: inverted index)가 사용된다.
B+트리는 인덱싱하는 값이 반복되지 않거나 적게 반복될 때 가장 효율적이다. 반면, '''비트맵 인덱스'''(영: bitmap index)는 기수가 낮아 값이 자주 반복되는 경우에 적합하다. 예를 들어, "성별" 열처럼 "남성", "여성" 값만 가지는 경우 B-트리보다 비트맵 인덱스가 효율적이며 성능 향상에 도움이 된다.
3. 1. 클러스터형 인덱스 (Clustered Index)
'''클러스터형 인덱스'''(Clustered Index)는 데이터가 특정 순서대로 물리적으로 정렬되어 저장되는 방식이다. 이는 책의 목차와 같이, 인덱스 키 값에 따라 데이터의 물리적 위치가 결정되는 것과 유사하다. 이러한 특성 때문에 테이블당 하나의 클러스터형 인덱스만 생성할 수 있다.
클러스터형 인덱스는 데이터 블록을 인덱스 순서에 맞춰 정렬하고, 행 데이터를 순서대로 저장한다. 이는 주소록에서 머리글자로 항목을 정렬해 놓은 것과 비슷하다. 클러스터형 인덱스의 키를 사용하여 범위 검색을 수행하면, 조건에 맞는 행들이 연속적으로 배치되어 있어 전반적인 검색 속도가 크게 향상된다. 그러나 이러한 속도 향상은 데이터가 클러스터형 인덱스와 동일하거나 반대 순서로 순차적으로 접근되거나, 항목 범위가 선택될 때만 유효하다.
대부분의 인덱스는 실제 데이터 레코드의 정렬 순서와 관계없이 구축된다. 따라서 범위 검색을 수행할 때, 해당 레코드는 테이블 내 여러 위치에 분산될 수 있으며, 분산된 레코드에 접근하기 위해 여러 번의 임의 I/O가 발생한다. 반면, 클러스터형 인덱스는 이러한 문제를 줄여준다.
물리적 레코드는 디스크 상에서 정렬된 순서대로 저장되므로, 시퀀스에서 다음 행 항목은 마지막 행 항목 바로 앞이나 뒤에 위치한다. 따라서 필요한 데이터 블록 읽기 횟수가 줄어든다. 클러스터형 인덱스의 주요 기능은 인덱스 블록에 따라 물리적 데이터 행의 순서를 정렬하는 것이다. 일부 데이터베이스는 데이터 블록과 인덱스 블록을 별도의 파일로 분리하기도 하고, 다른 데이터베이스는 두 개의 완전히 다른 데이터 블록을 동일한 물리적 파일 내에 배치하기도 한다.
일반적으로 데이터베이스 테이블에는 하나의 클러스터형 인덱스만 설정할 수 있다. 그러나 일부 데이터베이스 제품은 여러 개의 클러스터형 인덱스를 설정하거나 다차원 클러스터를 제공하기도 한다.
다음은 클러스터형 인덱스를 제공하는 데이터베이스 제품의 예시이다.
데이터베이스 제품 | 설명 |
---|---|
Oracle Database | 인덱스 구성 테이블 |
Microsoft SQL Server | 클러스터형 인덱스 |
MySQL InnoDB | 강제적으로 기본 키가 클러스터형 인덱스가 됨 |
PostgreSQL | CLUSTER 명령어를 통해 유사한 효과를 얻을 수 있음 |
Microsoft SQL Server에서 클러스터형 인덱스의 트리 구조는 실제 데이터에 대응하며, 비 클러스터형 인덱스처럼 다른 위치에 있는 데이터에 대한 포인터가 아니다.[12] 각 릴레이션은 클러스터형 인덱스를 1개, 비 클러스터형 인덱스를 여러 개 가질 수 있다.[13]
여러 데이터베이스와 테이블이 결합될 때, 이를 '''클러스터'''라고 부르며, 이는 클러스터형 인덱스와는 다른 개념이다. 클러스터 키 값을 공유하는 테이블의 레코드는 동일하거나 인접한 데이터 블록에 함께 저장된다. 이는 클러스터 키를 사용한 테이블 결합 속도를 향상시키는데, 일치하는 레코드가 함께 저장되어 이를 찾는 데 필요한 I/O가 줄어들기 때문이다.[14]
3. 2. 비클러스터형 인덱스 (Non-Clustered Index)
데이터는 임의의 순서로 존재하지만, 논리적 순서는 인덱스에 의해 지정된다. 데이터 열은 인덱스화된 컬럼 또는 표현의 값과는 상관없이 테이블 전체에 퍼져있다. 비클러스터형 인덱스 트리는 정렬된 순서로 레코드에 포인터를 포함하고 있는 인덱스의 리프 수순으로(페이지로 구조화된 엔진에서 데이터 페이지 내에 페이지와 열 수, 파일로 구조화된 엔진에서는 열 오프셋으로) 인덱스 키 값을 포함하고 있다.[1]비클러스터형 인덱스는 다음과 같은 특징을 가진다.[1]
- 행의 물리적 순서는 인덱스 순서와 동일하지 않다.
- 인덱싱된 열은 일반적으로 JOIN, WHERE, ORDER BY 절에서 사용되는 비-기본 키 열이다.
데이터베이스 테이블에는 여러 개의 비클러스터형 인덱스가 존재할 수 있다.[1]
비트맵 인덱스는 데이터 뭉치를 비트 열(bit array)로 저장하여 이러한 비트맵에 비트 연산을 수행함으로써, 대부분의 질의어에 응답하는 특별한 종류의 인덱스다. 가장 흔히 사용되는 B+tree와 같은 인덱스들은 그들이 인덱스하는 값이 반복되지 않는다면 가장 효율적이다. 반면, 비트맵 인덱스는 다양한 반복이 자주 일어나는 값을 위해 설계되었다. 예를 들어, 고객 데이터베이스에서 성 항목은 보통 남녀(M/F)의 2개의 분명한 값을 포함하고 있다. 그러한 변수들이 자주 사용된다면, 비트맵 인덱스는 중요한 실행의 장점을 가질 수 있다.
데이터베이스에서 조밀 인덱스는 데이터 파일 내의 모든 레코드에 대한 키와 포인터의 쌍을 가진 파일이다. 중복 키를 가진 클러스터드 인덱스에서, 조밀 인덱스는 그러한 키를 가진 첫 번째 레코드를 가리키고 있다.
데이터베이스에서 희소 인덱스는 데이터 파일 내의 모든 블록에 대한 키와 포인터의 쌍을 가진 파일이다. 이 파일 내의 모든 키는 정렬된 데이터 파일 내의 블록에 연결된 특정 포인터들과 연계되어 있다. 중복된 키를 가진 클러스터드 인덱스에서 희소 인덱스는 각 블록 내의 가장 빈도가 낮은 검색 키를 지시한다.
역방향 키 인덱스는 인덱스 내에 들어가기 전에 키 값을 뒤집는다. 예를 들어, 24538 값은 83542값으로 인덱스 내에 저장된다. 키 값을 뒤집는 것은 특히 단일 값으로 새롭게 증가되는 번호순으로 된 인덱스 데이터에 유용하다.
3. 3. 기타 인덱스
- '''비트맵 인덱스'''(bitmap index): 데이터의 대부분을 비트 배열(비트맵)로 저장하고, 이러한 비트맵에 대한 비트 연산을 수행하여 대부분의 쿼리에 답하는 특수한 종류의 인덱싱이다. B+ 트리와 같이 가장 일반적으로 사용되는 인덱스는 인덱싱하는 값이 반복되지 않거나 소수의 횟수만 반복될 때 가장 효율적이다. 반면에 비트맵 인덱스는 변수 값이 매우 자주 반복되는 경우를 위해 설계되었다. 예를 들어, 고객 데이터베이스의 성별 필드는 일반적으로 최대 세 개의 고유한 값(남성, 여성 또는 알 수 없음)을 포함한다. 이러한 변수의 경우 비트맵 인덱스는 일반적으로 사용되는 트리보다 상당한 성능 이점을 가질 수 있다.[3]
- '''조밀 인덱스'''(dense index): 데이터 파일의 모든 레코드에 대한 키와 포인터 쌍으로 구성된 파일이다. 이 파일의 각 키는 정렬된 데이터 파일의 특정 레코드에 대한 포인터와 연결된다. 키가 중복되는 클러스터형 인덱스에서 조밀 인덱스는 해당 키를 가진 첫 번째 레코드를 가리킨다.[3]
- '''희소 인덱스'''(sparse index): 데이터 파일의 모든 블록에 대한 키와 포인터 쌍으로 구성된 파일이다. 이 파일의 모든 키는 정렬된 데이터 파일의 블록을 가리키는 특정 포인터와 연결된다. 키가 중복되는 클러스터형 인덱스에서 희소 인덱스는 각 블록의 가장 낮은 검색 키를 가리킨다.[3]
- '''역 인덱스''' (reverse index): 인덱스에 입력하기 전에 키 값을 반전시킨다. 예를 들어, 값 24538은 인덱스에서 83542가 된다. 키 값을 반전시키는 것은 새로운 키 값이 단조 증가하는 시퀀스 번호와 같은 데이터를 인덱싱하는 데 특히 유용하다.
- '''식 인덱스''' (함수 인덱스, expression index): 함수나 식을 기반으로 한 인덱스이다. 예를 들어, `upper(last_name)` 함수를 기반으로 생성한 인덱스를 사용하여 last_name 열을 대소문자 구분 없이 데이터를 검색할 수 있다. (대문자로 변환된 값이 인덱스에 저장되어 있기 때문에, 검색 키는 대문자로 제공한다.)
- '''부분 인덱스''' (조건부 인덱스, partial index): 주어진 조건으로 행을 필터링하여 조건을 만족하는 행만 인덱스의 대상으로 한다.
- '''전치 인덱스'''(inverted index): 텍스트 데이터의 각 단어를 해당 단어가 포함된 문서나 레코드에 매핑하는 인덱스이다. 주로 전체 텍스트 검색에 사용된다.
- '''다차원 인덱스''' (Multidimensional Index): 여러 차원의 데이터를 효율적으로 검색하기 위한 인덱스이다. 주로 공간 데이터(GIS)에 사용된다.
4. 인덱스 구조
인덱스는 데이터 검색 속도를 높이기 위해 다양한 자료 구조를 사용한다. 대규모 데이터베이스에서는 선형 탐색이 비효율적이므로, 대부분의 데이터베이스 소프트웨어는 비선형 시간검색을 통해 성능을 향상시킨다.
데이터베이스에 N개의 데이터 항목이 있고, 특정 필드 값으로 데이터 항목 하나를 찾는 경우를 생각해 보자. 단순한 구현에서는 각 항목을 취득하여 조사해야 한다. 일치하는 항목이 하나뿐이면 처음 발견되었을 때 멈출 수 있지만, 여러 항목이 있을 가능성이 있으면 모든 항목을 검사해야 한다. 이는 평균적으로 O(N) 또는 선형 시간이 걸림을 의미한다. 데이터베이스에는 많은 객체가 포함되어 있고 검색은 일반적인 연산이므로, 검색 알고리즘의 효율을 높이는 것은 매우 중요하다.
인덱스는 이러한 검색 효율을 높이기 위한 데이터 구조이다. 이를 위해 사용되는 다양한 자료 구조가 존재한다. 각 자료 구조는 검색 효율, 인덱스 크기, 인덱스 갱신 효율 등 무엇을 우선시하는지에 따라 복잡한 설계상의 트레이드 오프가 있다. 많은 인덱스 디자인은 계산 시간이 로그 (O(log(N)))인 검색 효율을 보이며, 일부 애플리케이션에서는 계산 시간이 플랫 (O(1))인 검색 효율을 달성할 수 있다.
자주 사용되는 인덱스 구조로는 균형 이진 탐색 트리, B+ 트리, 해시 등이 있다. 검색 요구 사항에 따라 필요한 인덱스 구조가 다르므로, 서로 다른 구조를 가진 여러 개의 인덱스를 제공하는 데이터베이스 제품도 있다.
4. 1. B-트리 (B-Tree)
데이터베이스 인덱스에서 널리 사용되는 구조에는 균형 트리, B+ 트리, 해시 등이 있다.[4] 많은 데이터베이스는 인덱스에 B 트리 (또는 B+ 트리, B* 트리) 구조를 채택하고 있다. B 트리는 범위 검색에도 이용할 수 있다.B 트리 인덱스에서는 인덱스 정의 시 순서가 중요하다. 첫 번째 열만 조건으로 검색할 때는 인덱스를 이용할 수 있지만, 두 번째 이후의 열을 지정하는 것만으로는 인덱스를 이용할 수 없다. 예를 들어 인덱스 키가 (주소, 성, 이름)인 전화번호부 데이터베이스에서 주소는 검색에 이용할 수 있지만, 성만으로는 검색할 수 없다.
4. 2. 해시 인덱스 (Hash Index)
해시 함수를 사용하여 키 값을 해시 테이블에 저장하는 방식이다. 데이터베이스의 해시 인덱스는 기본 키 또는 이메일 주소와 같이 고유한 값을 포함하는 열에 생성된다. 해시 인덱스는 일반적으로 B-트리보다 성능 및 크기 면에서 유리하지만, 범위 검색은 불가능하고, 완전 일치 검색에만 사용할 수 있다.5. 인덱스 사용 (Usage)
인덱스는 데이터베이스 테이블에서 하나 이상의 열을 대상으로 생성되며, 무작위 참조 처리나 특정 순서로 레코드를 찾는 속도를 높여준다. 인덱스는 보통 원본 데이터의 행에 대한 "키"나 직접 링크를 포함하여 행 전체를 효율적으로 가져올 수 있게 한다.
데이터베이스에 따라서는 개발자가 함수나 식으로 계산된 열 값에 인덱스를 생성하는 식 인덱스를 사용하기도 한다. 예를 들어, `upper(last_name)`에 인덱스를 만들면 `last_name` 필드의 대문자 버전만 인덱스에 저장된다. 일부 시스템에서는 사용자 정의 함수나 내장 함수로 계산된 열 값에 인덱스를 생성할 수 있다. 또한, 특정 조건식을 만족하는 일부 레코드에 대해서만 인덱스를 생성하는 부분 인덱스도 있다.
인덱스는 테이블 내 키 열만 포함하지만, 테이블에는 키 열 이외의 데이터도 있으므로, 보통 인덱스가 차지하는 저장 용량은 대상 테이블보다 적다. 따라서 전체를 메모리에 보관하기 어려울 정도로 큰 테이블이라도, 해당 인덱스는 메모리에 보관할 수 있을 가능성이 있다.
5. 1. 빠른 조회를 위한 지원 (Support for fast lookup)
대부분의 데이터베이스 소프트웨어는 대규모 데이터베이스에서 선형 검색이 비효율적이기 때문에, 빠른 조회를 가능하게 하는 인덱싱 기술을 포함하고 있다.[12]데이터베이스에 N개의 데이터 항목이 있고, 그 중 하나의 필드 값을 기반으로 항목을 검색해야 한다고 가정해 보자. 간단한 구현은 각 항목을 검색하여 테스트에 따라 검사한다. 일치하는 항목이 하나만 있으면 해당 항목을 찾을 때 중단할 수 있지만, 여러 항목이 일치하는 경우 모든 항목을 테스트해야 한다. 즉, 평균적인 경우의 연산 횟수는 O(N) (선형 시간)이다. 데이터베이스는 많은 객체를 포함할 수 있고, 조회가 일반적인 연산이므로 성능을 향상시키는 것이 종종 바람직하다.[12]
인덱스는 조회의 성능을 향상시키는 모든 데이터 구조이다. 이를 위해 많은 다양한 자료 구조가 사용된다. 조회 성능, 인덱스 크기 및 인덱스 업데이트 성능과 관련된 복잡한 설계 상충 관계가 존재한다. 많은 인덱스 설계는 O(log(N)) (로그) 조회 성능을 보이며, 일부 응용 프로그램에서는 O(1) (평탄한) 성능을 달성할 수 있다.[12]
5. 2. 데이터베이스 제약 조건 관리 (Policing the database constraints)
인덱스는 UNIQUE, EXCLUSION, 기본 키, 외래 키 등의 제약 조건을 관리하는 데 사용된다.[1] 인덱스는 UNIQUE로 선언될 수 있으며, 이는 기본 테이블에 대한 암묵적인 제약 조건을 생성한다. 데이터베이스 시스템은 일반적으로 PRIMARY KEY로 선언된 열 집합에 대한 인덱스를 암묵적으로 생성하며, 일부는 이미 존재하는 인덱스를 사용하여 이 제약 조건을 관리할 수 있다. 많은 데이터베이스 시스템은 FOREIGN KEY 제약 조건에서 참조 및 참조된 열 집합이 모두 인덱싱되도록 요구하여 제약 조건에 참여하는 테이블에 대한 삽입, 업데이트 및 삭제의 성능을 향상시킨다.[1]일부 데이터베이스 시스템은 새로 삽입되거나 업데이트된 레코드에 대해 특정 술어가 다른 레코드에는 적용되지 않도록 보장하는 EXCLUSION 제약 조건을 지원한다. 이는 (동등성 술어를 사용하여) UNIQUE 제약 조건 또는 더 복잡한 제약 조건 (예: 겹치는 시간 범위나 교차하는 기하학적 객체가 테이블에 저장되지 않도록 보장)을 구현하는 데 사용될 수 있다. 이러한 제약 조건을 관리하려면 술어를 만족하는 레코드에 대한 빠른 검색을 지원하는 인덱스가 필요하다.[1]
6. 컬럼 순서 (Column order)
색인 정의가 열을 정의하는 순서는 중요하다. 색인된 첫 번째 열만 사용하여 일련의 행 식별자를 검색할 수 있다. 그러나 두 번째 이상의 색인 열만 사용하여 일련의 행 식별자를 검색하는 것은 불가능하거나 대부분의 데이터베이스에서 효율적이지 않다.[1]
예를 들어, 도시, 성, 이름 순으로 구성된 전화번호부에서 특정 도시 내의 모든 전화번호 목록을 쉽게 추출할 수 있다. 그러나 특정 성을 가진 모든 전화번호를 찾는 것은 매우 번거로울 것이다. 각 도시 섹션 내에서 해당 성을 가진 항목을 찾아야 하기 때문이다. 일부 데이터베이스는 이를 수행할 수 있지만 다른 데이터베이스는 색인을 사용하지 않는다.[1]
복합 색인이 (도시, 성, 이름) 열에 생성된 전화번호부 예에서, 세 필드 모두에 정확한 값을 제공하여 검색하면 검색 시간이 최소화된다. 하지만 도시와 이름 값만 제공하면 검색은 도시 필드만 사용하여 일치하는 모든 레코드를 검색한다. 그런 다음 순차 조회를 통해 이름과 일치하는지 확인한다. 따라서 성능을 향상시키려면 검색 열 순서대로 색인이 생성되었는지 확인해야 한다.[3]
7. 응용 및 제한 사항 (Applications and limitations)
인덱스는 많은 응용 분야에 유용하지만 몇 가지 제한 사항이 있다. 예를 들어, 다음 SQL 문을 고려해 보자.
```sql
SELECT first_name FROM people WHERE last_name = 'Smith';
```
인덱스 없이 이 문을 처리하기 위해 데이터베이스 소프트웨어는 테이블의 모든 행에서 `last_name` 열을 확인해야 한다. (이것을 전체 테이블 스캔이라고 한다). 인덱스가 있으면 데이터베이스는 단순히 인덱스 데이터 구조(일반적으로 B-트리)를 따라 Smith 항목을 찾을 때까지 따라간다. 이는 전체 테이블 스캔보다 계산 비용이 훨씬 적게 든다.
다음 SQL 문을 고려해 보자.
```sql
SELECT email_address FROM customers WHERE email_address LIKE '%@wikipedia.org';
```
이 쿼리는 이메일 주소가 "@wikipedia.org"로 끝나는 모든 고객에 대한 이메일 주소를 생성하지만, `email_address` 열이 인덱싱되어 있더라도 데이터베이스는 전체 인덱스 스캔을 수행해야 한다. 이는 인덱스가 단어가 왼쪽에서 오른쪽으로 진행된다는 가정하에 구축되었기 때문이다. 검색어 시작 부분에 와일드카드가 있으면 데이터베이스 소프트웨어는 기본 인덱스 데이터 구조를 사용할 수 없다. (다시 말해, WHERE 절은 ''sargable하지 않다'') 이 문제는 `reverse(email_address)`에 생성된 다른 인덱스를 추가하고 다음과 같은 SQL 쿼리를 사용하여 해결할 수 있다.
```sql
SELECT email_address FROM customers WHERE reverse(email_address) LIKE reverse('%@wikipedia.org');
```
이렇게 하면 와일드카드가 쿼리의 가장 오른쪽 부분(이제 `gro.aidepikiw@%`)에 배치되어 `reverse(email_address)`의 인덱스를 만족시킬 수 있다.
와일드카드 문자가 검색어의 양쪽에 "%wikipedia.org%"로 사용될 경우 이 필드에서 사용할 수 있는 인덱스가 사용되지 않는다. 대신 순차적 검색만 수행된다.[1]
8. 인덱스 동시성 제어 (Index concurrency control)
인덱스는 일반적으로 여러 트랜잭션 및 프로세스에서 동시에 접근하므로, 동시성 제어가 필요하다. 원칙적으로 인덱스는 일반적인 데이터베이스 동시성 제어 방식을 활용할 수 있지만, 인덱스에 특화된 동시성 제어 방식이 존재하며, 이는 일반적인 방식과 함께 적용되어 상당한 성능 향상을 얻을 수 있다.[1]
9. 커버링 인덱스 (Covering index)
커버링 인덱스는 쿼리에 필요한 모든 컬럼을 포함하는 특수한 인덱스이다. 일반적인 인덱스는 데이터 레코드를 빠르게 찾는 데 사용되지만, 데이터를 반환하려면 데이터 레코드를 읽어야 한다. 그러나 커버링 인덱스는 인덱스 자체에 필요한 모든 데이터 필드가 포함되어 있어, 데이터 레코드를 조회할 필요 없이 인덱스에서 바로 쿼리 결과를 얻을 수 있다.
예를 들어, 다음과 같은 테이블이 있다고 가정해 보자.
ID | 이름 | 기타 필드 |
---|---|---|
12 | 플러그 | ... |
13 | 램프 | ... |
14 | 퓨즈 | ... |
ID가 13인 이름을 찾기 위해 ID에 대한 인덱스를 사용할 수 있지만, 이름을 얻으려면 여전히 레코드를 읽어야 한다. 그러나 (ID, 이름)에 대한 커버링 인덱스를 사용하면 레코드를 조회할 필요 없이 인덱스에서 바로 이름을 얻을 수 있다.
커버링 인덱스는 데이터 검색 속도를 크게 높일 수 있지만, 추가 키로 인해 인덱스 자체가 커질 수 있으며, 이는 데이터 삽입 및 업데이트 속도를 늦출 수 있다. 이러한 인덱스 크기를 줄이기 위해 일부 시스템에서는 인덱스에 비키(non-key) 필드를 포함할 수 있다. 비키 필드는 인덱스 정렬의 일부가 아니지만, 리프 레벨(leaf level)에만 포함되어 전체 인덱스 크기가 더 작은 커버링 인덱스를 허용한다.[7]
커버링 인덱스는 특정 테이블에 대해서만 적용된다. 여러 테이블에 걸쳐 조인(JOIN)하는 쿼리는 잠재적으로 이러한 테이블 중 하나 이상에 대한 커버링 인덱스를 고려할 수 있다.[7]
참조
[1]
문서
PostgreSQL 9.1.2 Documentation: CREATE TABLE
http://www.postgresq[...]
[2]
문서
Overview of Clusters
http://download.orac[...]
Oracle® Database Concepts 10g Release 1 (10.1)
[3]
서적
Database Systems: The Complete Book
[4]
서적
Chapter 8: Building Fast-Performing Database Models
http://searchsecurit[...]
Wrox Publishing
[5]
웹사이트
Clustered Index Structures
http://msdn2.microso[...]
2012-10-04
[6]
웹사이트
Chapter 4: Creating Indices
http://www.microsoft[...]
Microsoft Press
2006-01
[7]
문서
Covering Indexes for Query Optimization
http://literatejava.[...]
[8]
웹사이트
11.9. Index-Only Scans and Covering Indexes
https://www.postgres[...]
2023-04-08
[9]
웹사이트
Create indexes with included columns - SQL Server
https://learn.micros[...]
2023-04-08
[10]
문서
PostgreSQL 9.1.2 Documentation: CREATE TABLE
http://www.postgresq[...]
[11]
서적
Chapter 8: Building Fast-Performing Database Models
http://searchsecurit[...]
Wrox Publishing
[12]
웹사이트
Clustered Index Structures
https://docs.microso[...]
マイクロソフト
2021-03-17
[13]
웹사이트
Chapter 4: Creating Indices
http://www.microsoft[...]
Microsoft Press
2006-01
[14]
문서
Overview of Clusters
http://download.orac[...]
Oracle® Database Concepts 10g Release 1 (10.1)
[15]
서적
Database Systems: The Complete Book
[16]
문서
Covering Indexes for Query Optimization
http://literatejava.[...]
[17]
간행물
1 VS COBOL II Application Programming Language Reference, Release 4, Eighth Edition (March 1993)
IBM Corporation
1993-03
[18]
서적
Enterprise PL/I for z/OS, Version 4.3, Language Reference
http://www-01.ibm.co[...]
2015-11-25
[19]
웹사이트
Informix C-ISAM
http://www-03.ibm.co[...]
2015-11-25
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com