[Algorithm] B Tree, B+ Tree
본문 바로가기

Computer Science/Algorithm

[Algorithm] B Tree, B+ Tree

  1. 개념
  2. 차이점
  3. 삽입과 삭제 과정
  4. 시간복잡도

B Tree

개념

B-트리(B-tree)는 데이터베이스와 파일 시스템에서 널리 사용되는 트리 자료구조의 일종으로, 이진 트리를 확장해 하나의 노드가 가질 수 있는 자식 노드의 최대 숫자가 2보다 큰 트리 구조이다.

 

모든 키는 정렬돼 있고, 탐색·순차접근·삽입·삭제가 모두 O(log n)에 가능하도록 높이(h)를 매우 낮게 유지한다.

이 구조는 디스크/페이지 I/O를 최소화하려고 고안됐고, DB와 파일시스템 인덱스의 표준이다.

 

최대 M개 자식을 가질 수 있는 B-Tree를 M차 B-Tree라고 부른다.

 

[ DB 인덱스로 B(+)-트리를 채택하는 이유 ]

메모리는 랜덤 접근이 빠르지만, 디스크/SSD는 페이지 단위 접근 비용이 크다.

B-트리는 한 노드(=한 페이지)에 많은 키를 담아 팬아웃(fan-out)을 크게 만들고, 높이 h를 2~4 정도로 작게 유지함으로써, 

탐색 시 읽는 페이지 수(I/O)를 극적으로 줄인다.

 

삽입 과정

  1. 리프까지 내려가 삽입 위치 결정
  2. 여유가 있으면 키 삽입 후 종료
  3. 오버플로우(키가 m−1 초과)분할(split):
    • 중앙 키를 위로 승격, 좌/우 노드로 분할
    • 필요 시 분할이 상위로 전파(루트까지 가면 높이 +1)
      복잡도: O(h)

 

삭제 과정

  1. 대상 키가 내부 노드에 있으면 보통 전임자/후임자 키와 교환해 리프까지 내려서 삭제
  2. 언더플로우(키가 최소치 미만)형제에게서 빌림(재분배) 또는 형제와 병합
  3. 조정이 상위로 전파될 수 있으며, 루트가 비면 높이 −1
    복잡도: O(h)

 


B+ Tree

개념

B-Tree에서 확장된 개념으로, 리프 노드를 제외하고는 값을 담지 않는 트리이다.

리프 노드에만 데이터를 저장하기때문에, 메모리를 더 많이 확보한다. 따라서 더 많은 key를 담을  수 있어 팬아웃이 커지고, 트리의 높이를 낮출 수 있다. 트리의 높이가 낮을수록 cache hit을 높일 수 있으므로 데이터 탐색이 빠르다. 

현대 DBMS의 순서 보존 인덱스 대부분이 이 구조(또는 변형)를 쓴다.

 

B+트리는 리프 노드를 순차적으로 연결하는 포인터 집합을 가지고 있다. 인덱스된 순차 파일 처리시, 포인터를 이용하여 키, 값을 일일이 비교하지 않고 다음 데이터에 접근해서 빠르게 처리할 수 있다.

 

풀 스캔(Full scan)시, B+Tree는 리프노드에 데이터가 있기 때문에 선형탐색을 할 수 있어서, B+트리보다 빠르다.

 

삽입 과정

대상 리프에 삽입 → 오버플로우 시 분할(split), 부모로 분할 전파 가능(루트 분할 시 높이+1)

 

삭제 과정

리프에서 제거 → 언더플로우 시 재분배/병합, 필요 시 상위로 전파(루트 축소 가능)

 

모두 O(h)=O(logₘ n), 여기서 m은 분기수(팬아웃)


B-Tree vs B+Tree

구분 B-Tree B+Tree
데이터 저장 위치 내부/리프 모두 데이터(또는 레코드 포인터) 보관 가능 리프만 실제 데이터, 내부는 키+자식 포인터만
탐색 종료 위치 내부에서 바로 찾을 수도 있음(리프로 안 내려갈 수 있음) 항상 리프에서 결과 획득(포인트 조회도 리프 도달)
팬아웃/높이 내부에 데이터가 섞이면 팬아웃이 상대적으로 작아질 수 있음 내부가 가벼워 팬아웃↑, 높이↓ 경향(페이지 I/O 절감)
범위 질의 가능하나 리프 연결이 없으면 추가 구조가 필요할 수 있음 리프들이 연결 리스트로 이어져 순차/범위 스캔 최적화
키 중복 구현체마다 상이(대개 내부/리프 혼재로 중복 덜함) 리프에 모든 키 보유라 필요한 범위에서 키 복제가 자연스러움
삽입/삭제 비용 분할/재분배/병합으로 O(log n) 로직 유사, 내부는 경로 라우팅만 변경하므로 업데이트가 비교적 단순. O(log n)

 

[ 왜 B+Tree가 실전에서 유리한가 ]

  • 낮은 높이(h): 내부가 가벼워 같은 페이지 크기에서 더 많은 키를 담아 디스크 접근 횟수 감소
  • 범위 질의/정렬 스캔: 리프 연결로 순차 접근이 빨라 ORDER BY/BETWEEN, 인덱스 스캔에 강함
  • DB 구현 친화성: PostgreSQL 등은 내부/리프 페이지 구조와 메타페이지를 갖춘 다층 인덱스로 B-트리류를 구현하며, 리프에 튜플 포인터(TID)를 저장한다

'Computer Science > Algorithm' 카테고리의 다른 글

[Algorithm] AVL 트리  (2) 2025.08.17
[Algorithm] 삽입 정렬  (1) 2025.08.17
[Algorithm] 버블 정렬  (0) 2025.08.17
[Algorithm] 해시충돌 해결방법과 각각의 특징  (3) 2025.08.14
[Algorithm] 이진 최소 힙 (heapq)  (1) 2025.08.13