본문 바로가기

Library/File Structure

Primary Indexing and Secondary Indexing

파일 처리를 위해 인덱스를 만들었다면, 이 인덱스의 키로 어떤 것을 선택하느냐가 중요한 문제가 된다. 프라이머리 인덱싱(Primary Indexing)은 전역적으로 각 파일을 구별할 수 있는 유일한 키로 인덱스(Index)를 구성하는 방식이다. 이 방법은 데이터 추가, 삭제, 검색을 위해서 사용되는 쿼리가 프라이머리 키(Primary Key)로만 제한된다. 즉, 각각의 요청에 대해서 작업을 요청하는 쪽에서는 항상 이 프라이머리 키를 알고 있어야 하는 문제가 있다. 프라이머리 인덱싱은 매핑 함수(Mapping Function)가 필요하지 않으며, 직접 접근이 가능하다는 장점이 있다. 고정폭 길이 레코드 저장 방식을 택하고 있다면 이러한 인덱스 구성은 필요하지 않은데, 그것은 파일의 물리적인 위치를 간단한 매핑 함수만으로 구할 수 있기 때문이다. 하지만, 가변폭 길이 레코드 저장 방식의 경우, 이런 간단한 매핑 함수를 사용하여 파일의 물리적인 위치를 구할 수 없으며, Space Reclaiming과 같은 문제는 이 문제를 더욱 어렵게 한다. 따라서, 이와 같은 경우, 인덱스를 구성하는게 일반적이다.

이런 문제 때문에, 실제적으로는 세컨더리 인덱싱(Secondary Indexing)이 더 자주 쓰인다. 세컨더리 키(Secondary Key)는 프라이머리 키와는 달리 전역적으로 유일하게 각 파일을 구별할 수 없으며, 쿼리로 주어지는 키에 대해서 해당 데이터 중복이 발생한다. 세컨더리 인덱싱은 이렇게 중복되는 데이터를 구별하기 위해 프라이머리 키를 리스트와 같은 형식으로 추가적으로 가지고 있어야 하며, 요청된 데이터가 해당 데이터와 맞는지 확인해야 한다. 이와 같은 세컨더리 인덱싱을 역 인덱싱(Inverted Indexing)이라고도 한다.

프라이머리 키는 너무나 기본적인 정보이기 때문에 클라이언트가 직접 사용하기에는 적절하지 않을 수도 있으며, 세컨더리 키는 상대적으로 더 클라이언트 쪽에 가깝기 때문에 좀 더 쿼리에 적합하지만 데이터 중복 가능성이 있다. 세컨더리 인덱싱은 단일 인덱스를 가지는 프라이머리 인덱싱에 비해, 더 많은 테이블을 가지기 때문에 데이터 검색, 추가, 삭제가 일어날 때 더 많은 시간이 소모되며, 좀 더 많은 메모리가 필요하다. 이것은 프라이머리 인덱싱과 비교해봤을 때 세컨더리 인덱싱과의 트레이드-오프 관계가 된다.