본문 바로가기

Library/File Structure

Indexing

파일 처리에 관한 요청을 받았다고 하자. 만약 파일로 구성된 데이터가 모두 메모리에 있다면 간단히 그 요청을 처리할 수 있을 것이다.여기서 메모리란, Primary Storage를 의미하는 것으로 데이터 처리 작업이 일어나는 실제적인 공간을 뜻한다. 그러나, 메모리는 상대적으로 마그네틱 디스크보다 용량이 적고 비싸기 때문에, 일반적으로 대부분의 데이터는 마그네틱 디스크와 같은 보조 기억 장치(Secondary Storage)에 저장되며, 필요한 데이터의 일부만 메모리에 올려서 사용하게 된다.

그러나, 이렇게 데이터의 일부만 메모리에 올려서 처리한다고 하더라도 디스크에서 해당 데이터를 찾는 것은 쉬운 일이 아니다. 무엇보다 디스크에 접근하는 것은 기계적인 동작을 요구하는 작업이므로, 디스크 전체를 검색하는 것은 디스크가 임의 접근(Random Access)을 지원하더라도 매우 비싼 작업이 된다.

인덱싱(Indexing)이라는 것은, 해당 데이터가 디스크에서 위치하는 정보와, 그 데이터를 구별하는 키 정보를 짝으로 테이블을 구성해두는 것을 말한다. 이 인덱스는 단순히 키와 물리적인 위치 정보만을 가지고 있기 때문에 크기가 매우 작으며, 메모리에 모두 올릴 수 있는 가능성이 높기 때문에 대부분의 경우 매우 효과적인 탐색 기법이 된다. 즉, 원하는 데이터를 디스크에서 직접 찾는 것보다, 이 인덱스를 참조하여 한번에 디스크에 접근하면 데이터 접근 시간을 크게 줄일 수 있다.

만약, 저장되는 데이터가 고정폭 길이의 레코드라면, 원하는 데이터를 찾기 위해서 인덱스를 참조할 필요없이, 간단히 매핑 함수(Mapping Function)를 사용할 수 있을 것이다. 그렇지만, 대부분의 경우 가변폭 길이의 레코드를 사용하게 되므로 이런 매핑 함수를 제공할 수 없기 때문에, 인덱스를 사용하게 된다.

특히, 이 인덱스가 이미 정렬되어 있는 상태라면, 효과적인 탐색 기법으로 데이터 접근 시간을 더 줄일 수 있다. 물론 데이터를 정렬하는 것도 일정 시간이 필요하지만, 일반적으로 데이터의 삽입, 삭제보다 검색이 훨씬 자주 일어나기 때문에 인덱스를 정렬해두는 것은 좋은 전략이 될 수 있다.