Post

index와 B-tree 그리고 Hash Index

데이터이 양이 많아지면 많아질수록 원하는 데이터를 찾는 시간이 오래 걸린다. 테이블의 처음부터 끝까지 검색하기 때문에 성능이 떨어지게 된다.

이러한 대량의 데이터를 빠르고 효율적으로 조회하기 위해서 인덱스가 도입되었다.

데이터가 저장된 위치에 대한 정보를 별도의 구조로 저장하여 필요한 데이터에 직접 찾아갈 수 있도록 도와준다. 책의 목차처럼 필요한 내용을 바로 찾아갈 수 있도록 해주기 때문에 검색 시간을 단축할 수 있다.


Index

데이터베이스 테이블에서 데이터를 빠르게 검색할 수 있도록 도와주는 데이터 구조

주로 테이블 내의 특정 컬럼에 대해 인덱스를 생성하여, 해당 컬럼의 값을 정렬하고 물리적 데이터 위치를 함께 저장한다.
이를 통해 전체 테이블을 스캔하지 않고, 인덱스를 통해 빠르게 원하는 값을 찾을 수 있다.


인덱스는 테이블 내의 1개 또는 여러 개의 컬럼을 이용하여 생성할 수 있으며, 데이터베이스의 테이블과 별도로 인덱스를 저장하기 위한 추가적인 저장공간이 필요하다.

  • 키 값 : 인덱스가 참조하는 컬럼 값
  • 포인터/ 참조 : 실제 데이터가 저장된 테이블의 행을 가리키는 포인터

특정 컬럼의 값을 키로 사용하기 때문에 테이블 전체를 스캔하지 않고 원하는 데이터를 찾을 수 있고, 정렬된 상태로 저장되기 때문에 정렬된 데이터에 빠르게 접근할 수 있어, 검색 속도가 빠르다.


장점

인덱스를 이용하면 특정 키 값을 빠르게 검색할 수 있다.
인덱스는 정렬된 데이터 구조이기 때문에, 비트리 인덱스와 같은 알고리즘을 사용하여 효율적으로 데이터를 찾을 수 있고, 이를 통해 전체 테이블을 스캔하지 않고 원하는 데이터를 조회할 수 있 더 빠른 응답시간을 제공한다.

반대로, 정렬되지 않은 데이터는 선형 검색을 해야하기 때문에 데이터가 많아질수록 검색 속도가 느려진다.


단점

추가적인 저장공간을 요구하며, 데이터의 삽입, 삭제, 수정 시 인덱스를 리밸런싱 해야하기 때문에 오버헤드가 발생할 수 있다.

특정 키를 기준으로 검색하는 경우 빠른 속도를 기대할 수 있으나 인덱스가 없는 다른 컬럼을 기준으로 검색하는 경우 성능 저하가 발생할 수 있다.

따러서 자주 사용되는 검색 조건에 대해 적절한 인덱스를 생성하고 관리하는 것이 중요하다.



언제 사용될까

특정 컬럼이 자주 검색 조건으로 사용되거나, 정렬 및 그룹화 작업이 자주 발생하는 경우 인덱스를 통해 성능을 향상시킬 수 있다.

예를 들어 주문 번호, 날짜, 사용자 ID 등 검색이 빈번한 컬럼은 인덱스를 통해 효율적으로 처리할 수 있다.

또한, 조인 연산에 사용되거나 범위 검색 및 부분 일치 검색을 수행할 때도 인덱스가 유용하게 사용된다.

하지만 너무 많은 인덱스를 생성하면, 데이터베이스의 성능 저하를 일으킬 수 있어, 자주 사용되는 검색 조건에 맞춰 꼭 필요한 인덱스만 생성하는 것이 좋다.




인덱스 구조

B-tree 인덱스

Balanced tree의 약자로 균형잡힌 트리 구조이다.
모든 리프노드가 동일한 깊이에 위치하여, 노드의 삽입 및 삭제 시 특정 규칙에 맞게 재정렬 되어 밸런스를 유지하는 트리이다. 각 노드는 키와 포인터를 가지고 있으며 키는 정렬된 상태로 저장된다.

검색 시 루트 노드부터 시작하여 비교를 통해 적절한 리프노드에 도달한다. 범위 검색 및 정렬된 데이터에 빠르게 접근할 수 있어 일반적으로 많이 사용된다.


해시 인덱스

해시 함수를 사용하여 키 값을 해시코드로 변환하고 이를 기반으로 데이터를 저장하고 검색하는 구조이다.
키와 값의 구조로 되어있기 때문에 해시 인덱스의는 탐색 시간이 O(1) 로 탐색 시간이 빠르다.

정확하게 일치하는 검색에 대해서는 빠르지만 범위를 검색하는 경우에는 적합하지 않다.

해시 인덱스는 데이터가 해시코드에 따라 분산되어 있어, 데이터를 정렬된 순서로 접근하는 것이 어렵고, 특정 기준보다 크거나 작은 값에 대한 범위 검색에 적합하지 않다.

This post is licensed under CC BY 4.0 by the author.