인덱스(Index)는 데이터베이스에서 데이터의 검색 속도를 향상시키기 위해 사용되는 데이터 구조입니다.
데이터베이스 내의 테이블에서 특정 열(칼럼)을 기반으로 생성되며, 이 열의 값을 기준으로 데이터에 대한 빠른 액세스를 가능하게 합니다.
즉, 인덱스를 사용하면 DBMS은 전체 테이블을 검색하지 않고도 원하는 데이터를 빠르게 찾을 수 있습니다.
인덱스의 작동 방식은 다음과 같습니다
인덱스 생성
: 데이터베이스 관리자가 특정 열을 기반으로 인덱스를 생성합니다.
이 열은 주로 검색이나 조인과 같은 연산에서 자주 사용되는 열로 선택됩니다.
인덱스 구조 생성
: 선택한 열의 각 값과 해당 값이 존재하는 실제 데이터 위치를 특정한 데이터 구조에 저장합니다.
데이터 변경 시 인덱스 업데이트
: 데이터가 추가, 수정 또는 삭제될 때, 해당 데이터의 인덱스 역시 업데이트되어야 합니다.
이는 추가적인 오버헤드를 발생시키지만, 데이터의 검색 속도 향상을 위해 필수적입니다.
데이터 검색
: 사용자가 데이터를 검색하거나 조회할 때, DBMS는 인덱스를 사용하여 원하는 데이터의 위치를 빠르게 찾아냅니다. 인덱스를 통해 데이터의 위치를 찾은 후에는 해당 데이터에 대한 실제 디스크 액세스를 수행하여 데이터를 가져옵니다.
B-트리 인덱스
: B-트리는 데이터베이스에서 가장 일반적으로 사용되는 인덱스 구조 중 하나입니다.
데이터를 정렬된 상태로 유지하면서 효율적인 검색, 삽입, 삭제를 지원합니다.
B-트리는 여러 레벨의 노드를 가지며, 루트에서부터 리프 노드까지 내려가면서 검색 작업을 수행합니다.
B+트리 인덱스
: B+트리는 B-트리의 확장된 형태로, 주로 디스크 기반의 데이터베이스 시스템에서 사용됩니다.
B+트리는 데이터를 리프 노드에만 저장하고 내부 노드는 인덱스 역할만 수행하여 데이터에 대한 효율적인 범위 검색을 지원합니다.
해시 인덱스
: 해시 함수를 사용하여 각 인덱스 키를 해시값으로 변환한 다음, 해당 해시값을 기반으로 데이터의 위치를 찾습니다.
해시 인덱스는 정확한 값으로 검색하는 데 매우 효과적이지만, 범위 검색이나 정렬된 결과를 얻는 데는 적합하지 않을 수 있습니다.
클러스터드 인덱스
: 클러스터드 인덱스는 테이블의 레코드와 인덱스가 함께 저장되는 방식입니다.
테이블의 주요 키를 기준으로 정렬된 형태로 저장되므로, 주로 범위 검색에 효과적입니다.
비클러스터드 인덱스
: 비클러스터드 인덱스는 인덱스 키와 해당 키가 가리키는 레코드의 실제 데이터 위치가 분리되어 저장되는 방식입니다.
이를 통해 하나의 테이블에 여러 개의 비클러스터드 인덱스를 생성할 수 있습니다.
R-트리 인덱스
: R-트리는 공간 데이터를 위한 인덱스 구조로, 지리 정보 시스템(GIS)과 같은 분야에서 자주 사용됩니다. 공간 상에서 범위 검색과 공간 연산을 지원합니다.
전문 텍스트 인덱스
: 전문 텍스트 인덱스는 텍스트 데이터에서 특정 단어나 문구를 검색하는 데 특화된 인덱스입니다.
전문 텍스트 검색 엔진은 단어의 형태소 분석, 불용어 처리 등을 수행하여 정확한 텍스트 검색을 가능하게 합니다.
Table Full Scan과 Index Range Scan은 데이터베이스에서 데이터를 읽어오는 두 가지 기본적인 방법입니다. 각각의 방법은 데이터 액세스에 있어서 다른 방식을 사용하며, 특정 상황에 따라 선택되어야 합니다.
: Table Full Scan은 데이터베이스에서 특정 조건 없이 테이블의 모든 레코드를 처음부터 끝까지 읽어오는 방법입니다. 이는 주로 작은 테이블이나 특정 조건 없이 전체 데이터를 처리할 때 사용됩니다. 모든 레코드를 순차적으로 읽기 때문에 I/O 비용이 비교적 크게 발생할 수 있습니다.
Index Range Scan은 인덱스를 이용하여 특정 조건에 맞는 데이터 범위를 검색하는 방법입니다.
인덱스가 특정 열을 정렬된 상태로 유지하고 있기 때문에 원하는 조건에 해당하는 범위를 빠르게 찾아낼 수 있습니다.
장점
대량의 데이터에서도 빠른 검색을 지원합니다.
필요한 데이터만을 추출할 수 있어 I/O 비용이 줄어듭니다.
정렬된 데이터를 반환하기 때문에 정렬 작업이 필요 없습니다.
단점
인덱스를 이용하는 만큼 약간의 추가적인 오버헤드가 발생할 수 있습니다.
인덱스가 존재하지 않는 경우에는 사용할 수 없습니다.