[Database] Index
Index :
데이터베이스는 관련 레코드를 찾기 위해 전체 테이블을 스캔해야 하고,
이는 특히 테이블이 매우 큰 경우 매우 느리고 비효율적일 수 있기에 Index를 사용하게 된다.
Index는 테이블의 특정 Column 또는 Field를 기반의 데이터를 빠르게 검색할 수 있는
데이터 구조이며, 일반적으로 B tree(Balance Tree) Algorithm에 의하여 Index가 생성이 된다.
[Index 생성에 기반이 되는 알고리즘이 다수 존재]
페이지의 내용을 기반으로 특정 페이지를 빠르게 찾을 수 있는 책의 색인과 유사하다.
인덱스가 효율적인 이유는 대수확장성을 들 수 있으며, 이는 트리 깊이가 리프 노드 수에 비해
매우 느리게 성장하는 것을 말한다.
[깊이가 증가할 때마다 최대 인덱스 항목의 수는 4배씩 증가]
종류 :
인덱스는 테이블에 있는 하나 이상의 열에서 생성되며, Cluster Index / Non-Cluster Index로 나뉜다.
- Cluster Index : 인덱싱 된 열을 기반으로 테이블에서 데이터의 물리적 순서를 결정
- Non-Cluster Index : 인덱싱 된 데이터의 위치를 가리키는 별도의 데이터 구조를 생성
Pros :
1. 향상된 쿼리와 빠른 데이터 검색 :
인덱스 사용의 주요 이점 중 하나는 향상된 쿼리 성능이다.
일반적으로 사용되는 열에 인덱스를 생성함으로써 데이터베이스는
전체 테이블을 스캔하는 대신 관련 데이터를 빠르게 찾을 수 있다.
이는 실시간 데이터 액세스가 필요한 애플리케이션에게 큰 장점으로 볼 수 있다.
2. 최적화된 데이터 수정 :
인덱스는 삽입, 업데이트 및 삭제와 같은 데이터 수정 작업을 지연시킬 수 있지만,
업데이트해야 하는 데이터의 양을 줄여 작업을 최적화할 수 있다.
ex) Record를 업데이트할 때, DB에서 전체를 스캔하여 업데이트가 것이 아닌 특정 인덱스 항목만 업데이트
3. 동시성 향상 :
인덱스는 공유 리소스에 대한 경합을 줄이고 이는 데이터베이스 동시성을 향상할 수 있다.
여러 트랜잭션이 인덱스의 다른 부분에 동시에 액세스할 수 있도록 함으로써 데이터베이스는
더 많은 동시 사용자 및 트랜잭션 지원이 가능하다는 것이다.
Cons :
1. 디스크 공간 및 메모리 사용량 증가 :
인덱스는 특히 열이 많은 대형 테이블의 경우 상당한 양의 디스크 공간과 메모리를 필요로 한다.
이는 디스크나 메모리와 관련하여 제약이 있는 데이터베이스의 경우 특히 문제를 발생할 수 있다.
2. 느린 데이터 수정 :
인덱스는 데이터 수정 작업을 최적화할 수 있지만, 데이터베이스가 인덱스와
기본 데이터까지 업데이트하도록 필요로 하기 때문에, 데이터 수정에 오래 걸릴 수 있다.
3. 인덱스 유지 관리 필요성 :
시간이 지나고, 데이터와 그와 관련된 쿼리들이 변경되면서 인덱스의 효율성이 떨어질 수 있다.
이는 인덱스를 통한 이점이 있는지 정기적인 모니터링과 유지 관리가 필요하다는 것이다.
4. 인덱스 남용의 가능성 :
인덱스를 너무 많이 만들거나 잘못된 유형의 인덱스를 생성하면 인덱스를 유지 관리하는데
필요한 오버헤드가 증가하여 실제로 성능이 저하될 수 있기 때문에,
인덱스는 특정 요구 사항에 맞춰서 신중하게 고려하고 설계하여 생성해야 한다는 것이다.