인덱스(Index)
인덱스(Index)는 데이터베이스에서 특정 열(칼럼)의 값을 기반으로 데이터의 빠른 검색을 지원하는 자료 구조입니다. 인덱스는 일종의 색인이며, 특정 값에 대한 레코드의 위치를 빠르게 찾아내는 데 사용됩니다. 데이터베이스의 인덱스는 일반적으로 B-트리나 해시 테이블과 같은 구조로 구현됩니다.
인덱스는 다음과 같은 장점을 제공합니다:
- 데이터 검색 속도 향상: 인덱스를 사용하면 특정 열의 값을 기준으로 데이터를 빠르게 검색할 수 있습니다. 인덱스를 사용하면 전체 테이블을 순차적으로 검색하는 비용을 줄일 수 있습니다.
- 정렬된 결과 반환: 대부분의 인덱스는 데이터를 정렬된 순서로 유지합니다. 따라서 인덱스를 사용하여 데이터를 검색하면 결과가 정렬된 상태로 반환됩니다.
- 유니크한 값 보장: 유니크 인덱스(unique index)를 사용하면 특정 열의 값이 고유하다는 것을 보장할 수 있습니다. 이는 중복된 값을 허용하지 않는 경우 유용합니다.
인덱스의 두 가지 기본 종류
순서 인덱스(Ordered Index)와 해시 인덱스(Hash Index)는 데이터를 검색하기 위한 인덱스의 두 가지 주요 유형입니다. 각각의 특징을 살펴보겠습니다:
- 순서 인덱스(Ordered Index):
- 순서 인덱스는 키 값을 정렬된 순서로 저장하는 인덱스입니다. 대부분의 데이터베이스 시스템에서 기본적으로 제공되는 인덱스 유형입니다.
- B-트리(B-Tree)나 B+트리(B+Tree)와 같은 트리 기반의 자료 구조를 사용하여 구현됩니다.
- 순서 인덱스를 사용하면 범위 검색(Range Scan)이나 정렬된 순서로 결과를 반환하는 데 유리합니다. 예를 들어, WHERE 절에 BETWEEN 조건이나 ORDER BY 절에 사용될 수 있습니다.
- 하지만 쓰기 작업(INSERT, UPDATE, DELETE)의 성능에는 영향을 미칠 수 있습니다.
- 해시 인덱스(Hash Index):
- 해시 인덱스는 해시 함수를 사용하여 키 값을 해시 값으로 변환하고, 해당 해시 값에 대한 위치에 직접 데이터를 저장하는 인덱스입니다.
- 해시 인덱스는 매우 빠른 검색 속도를 제공합니다. 해시 함수에 의해 생성된 해시 값은 고유한 위치를 가리키므로 데이터를 검색하는 데 상수 시간(시간 복잡도 O(1))이 걸립니다.
- 그러나 해시 인덱스는 범위 검색과 정렬된 결과 반환에 적합하지 않습니다. 또한 해시 충돌(hash collision)과 같은 문제가 발생할 수 있습니다.
- 대부분의 데이터베이스 시스템에서는 해시 인덱스를 제공하지만, 순서 인덱스보다는 선택 사항으로 적용됩니다.
클러스터링(Clustering)
클러스터링(Clustering)은 데이터베이스에서 데이터를 논리적으로 관련된 키 값을 기준으로 묶는 것을 말합니다. 이는 데이터베이스에서 효율적인 데이터 액세스를 위해 사용됩니다. 클러스터링은 테이블 내의 레코드를 특정 컬럼 값에 따라 묶어서 해당 값이 비슷한 레코드들이 물리적으로 인접하게 저장되도록 합니다.
클러스터링의 주요 특징은 다음과 같습니다:
- 데이터 접근 최적화: 클러스터링을 사용하면 특정 컬럼 값에 따라 관련된 레코드들이 물리적으로 인접하게 저장됩니다. 이로 인해 동일한 클러스터 키 값을 가진 레코드들은 서로 인접하여 저장되므로 데이터 액세스가 효율적으로 이루어집니다.
- 클러스터 키: 클러스터링된 테이블에서는 클러스터 키(cluster key)라는 특정 컬럼이 클러스터링을 위한 기준이 됩니다. 클러스터 키를 기준으로 데이터가 묶이며, 클러스터링된 인덱스는 이 클러스터 키를 기반으로 구성됩니다.
- 검색 성능 향상: 클러스터링된 테이블에서는 클러스터 키 값을 기반으로 한 검색이 효율적으로 수행됩니다. 클러스터 키 값을 사용하는 쿼리는 인덱스 스캔을 통해 더 빠르게 데이터를 찾을 수 있습니다.
- 범위 검색 효율성: 클러스터링된 테이블에서는 클러스터 키 값에 따라 데이터가 묶여 있으므로, 범위 검색(range scan)이 효율적으로 수행됩니다. 클러스터 키 값을 기준으로 한 범위 검색은 인덱스를 효과적으로 활용할 수 있습니다.
밀집 인덱스(Dense Index)와 희소성 인덱스(Sparse Index):
- 밀집 인덱스와 희소성 인덱스는 인덱스 항목의 밀집도(데이터 항목과 인덱스 항목의 관계)를 나타냅니다.
- 밀집 인덱스는 대부분의 데이터 항목에 대한 인덱스 항목이 존재하는 경우를 말하며, 희소성 인덱스는 그 반대의 경우를 말합니다. 즉, 특정 키 값에 대한 인덱스 항목이 존재하지 않거나 매우 드물게 존재할 때 희소성 인덱스라고 합니다.
- 희소성 인덱스는 인덱스 크기를 줄이고 저장 공간을 절약할 수 있지만, 일반적으로 밀집 인덱스보다 검색 성능이 떨어질 수 있습니다.
동시성 제어(Concurrency Control)
동시성 제어(Concurrency Control)는 데이터베이스 시스템에서 여러 사용자가 동시에 데이터를 읽고 쓸 때 발생하는 문제를 관리하는 메커니즘입니다. 다수의 사용자가 동시에 데이터를 업데이트하거나 쓰려고 할 때, 데이터베이스 시스템은 일관된 상태를 유지하기 위해 동시성 제어 메커니즘을 사용합니다.
동시성 제어의 목표는 다음과 같습니다:
- 일관성 보장: 여러 사용자가 동시에 데이터에 접근할 때, 데이터베이스는 일관된 상태를 유지해야 합니다. 동시성 제어는 데이터베이스의 일관성을 보장하기 위해 트랜잭션 간의 상호 작용을 관리합니다.
- 데이터 무결성 보호: 동시성 제어는 데이터베이스의 데이터 무결성을 보호합니다. 여러 사용자가 동시에 데이터를 업데이트하려고 할 때, 동시성 제어는 서로 간섭하지 않도록 하여 데이터베이스의 무결성을 유지합니다.
- 사용자 간의 충돌 방지: 동시성 제어는 다중 사용자 환경에서 발생할 수 있는 충돌을 방지하고, 트랜잭션 간의 간섭을 최소화합니다. 이를 통해 사용자 간의 경합 조건을 해결하고 데이터 접근 시스템의 효율성을 향상시킵니다.
동시성 제어는 다양한 방법으로 구현될 수 있으며, 대표적인 방법으로는 다음과 같은 것들이 있습니다:
- Locking: 트랜잭션 간의 충돌을 방지하기 위해 데이터베이스에서 잠금(lock)을 사용합니다.
- MVCC (Multi-Version Concurrency Control): 데이터베이스에서 다중 버전 동시성 제어를 사용하여 동시성을 관리합니다.
- Timestamping: 각 트랜잭션에 타임스탬프를 할당하여 동시성을 제어합니다.
- 미세한 병행 제어 기법: 트랜잭션 간의 충돌을 최소화하고 성능을 향상시키기 위해 더 정교한 제어 기법을 사용합니다.
락(locking)
락(locking)은 데이터베이스에서 동시에 여러 트랜잭션이 데이터에 접근할 때 발생할 수 있는 문제를 해결하기 위한 동시성 제어 메커니즘입니다. 여러 사용자가 동시에 데이터를 읽거나 쓸 때 발생할 수 있는 갱신 손실(lost update), 더티 읽기(dirty read), 반복 가능하지 않은 읽기(non-repeatable read), 팬텀 읽기(phantom read)와 같은 문제를 방지하고 데이터의 일관성을 유지하기 위해 사용됩니다.
락은 크게 공유 락(Shared Lock)과 배타적 락(Exclusive Lock)으로 구분됩니다.
- 공유 락(Shared Lock): 여러 트랜잭션이 동시에 데이터를 읽을 수 있도록 허용하는 락입니다. 쓰기 작업이 아닌 읽기 작업에 대해 사용됩니다. 공유 락을 획득한 트랜잭션은 데이터를 읽을 수 있지만, 다른 트랜잭션이 동시에 해당 데이터를 수정할 수 없습니다.
- 배타적 락(Exclusive Lock): 한 트랜잭션이 데이터를 변경할 때 사용되는 락입니다. 배타적 락을 획득한 트랜잭션은 해당 데이터를 읽거나 쓸 수 있지만, 다른 트랜잭션은 동시에 해당 데이터에 대한 읽기 또는 쓰기 작업을 할 수 없습니다.
락은 트랜잭션의 범위에 따라 획득되며, 트랜잭션이 커밋되거나 롤백되면 락이 해제됩니다. 락을 획득하기 위해 대기하는 동안 발생하는 데드락(deadlock)이나 라이브락(livelock) 같은 문제를 방지하기 위해 락을 획득할 때 타임아웃(timeout)을 설정하기도 합니다.
'정보처리기사' 카테고리의 다른 글
통합구현 (0) | 2024.03.25 |
---|---|
데이터베이스 파티셔닝 (0) | 2024.03.25 |
데이터 조작 프로시저 성능 개선 (1) | 2024.03.22 |
SQL (1) | 2024.03.22 |
데이터 조작 프로시저 개발 (0) | 2024.03.22 |