SQL 인덱스는 데이터베이스의 효율적인 검색을 위해 사용되는 자료구조입니다. 이 글에서는 인덱스의 내부 구조와 페이지 분할 방법에 대해 알아보겠습니다.
인덱스 내부 구조
일반적으로, SQL 인덱스는 B-트리 혹은 B+트리라는 자료구조를 사용합니다. 이들 트리 구조는 키-값 쌍을 저장하여 검색을 빠르게 수행할 수 있도록 합니다.
B-트리는 각 노드가 여러 개의 키를 가질 수 있는 이진 트리입니다. 모든 리프 노드는 같은 레벨에 위치하며, 내부 노드는 자식 노드들을 가리키는 포인터를 가집니다. 이러한 구조로 인해 키의 검색이 효율적으로 이루어집니다.
B+트리는 B-트리의 변형입니다. B+트리는 리프 노드에서만 키와 데이터를 저장하고, 내부 노드는 검색을 위한 포인터만을 가지고 있습니다. 이로 인해 B+트리는 데이터를 순차적으로 읽는 작업에 특히 효율적입니다.
페이지 분할 방법
인덱스는 여러 개의 페이지로 구성됩니다. 각 페이지는 디스크 상의 고유한 블록에 저장되며, 페이지의 크기는 데이터베이스 시스템에 따라 다를 수 있습니다. 인덱스의 페이지는 일반적으로 논리적인 순서로 정렬되어 있으며, 페이지 분할 방법은 검색 성능에 영향을 미칩니다.
인덱스의 페이지 분할 방법은 주로 세 가지 방법을 사용합니다:
- Fixed 페이지 분할: 모든 페이지의 크기가 고정되어 있고, 공간의 낭비를 최소화하기 위해 사용됩니다. 하지만 데이터의 삽입, 삭제 또는 업데이트에 따라 페이지가 가득 찰 경우, 추가적인 페이지를 할당해야 합니다.
- Dynamic 페이지 분할: 페이지의 크기가 가변적이며, 새로운 데이터를 삽입할 때마다 적절한 크기의 페이지가 할당됩니다. 이 방법은 삽입이 빈번한 환경에서 유용합니다.
- Hybrid 페이지 분할: 고정 크기인 초기 페이지를 사용하다가, 페이지가 가득 찰 경우에 동적으로 크기를 조정하는 방법입니다. 이 방법은 고정 크기 페이지와 가변 크기 페이지의 장점을 결합한 것으로, 효율적인 공간 사용과 성능을 제공합니다.
각 페이지 분할 방법의 선택은 데이터베이스의 크기, 데이터의 변동성, 검색 성능 요구사항 등 다양한 요소를 고려해야 합니다. 적절한 페이지 분할 방법을 선택하여 인덱스의 성능을 최적화할 수 있습니다.
마무리
SQL 인덱스는 데이터베이스의 검색 성능을 향상시키는 중요한 요소입니다. 인덱스의 내부 구조와 페이지 분할 방법을 이해하여 적절한 인덱스를 설계하고 관리하는 것은 데이터베이스 성능을 향상시키는 데 큰 도움이 됩니다.
참고 자료
- Database Systems Concepts, Silberschatz et al. (Chapter 12)
- PostgreSQL - Indexing: https://www.postgresql.org/docs/current/indexes.html