본문 바로가기
DB

B+Tree, B-Tree

by kiwi_wiki 2025. 1. 17.

B+Tree

인덱스가 B+Tree로 되어있는 이유

  • 데이터가 리프노드에만 있다
  • B-Tree와 다르게 Best, Worst가 없이 탐색의 시간복잡도는 무조건 O(log N)이다
  • 리프노드는 연결 리스트의 형태로 되어있어서 인접한 다음 노드에 바로 접근 가능하다. (B-Tree와 다르게 선형 탐색 가능)

B-Tree

비교

구분 B-tree B+tree
데이터 저장 리프 노드, 브랜치 노드 모두 데이터 저장 가능 오직 리프 노드에만 데이터 저장 가능
트리의 높이 높음 낮음(한 노드 당 key를 많이 담을 수 있음)
풀 스캔 시, 검색 속도 모든 노드 탐색 리프 노드에서 선형 탐색 
키 중복 없음 있음(리프 노드에 모든 데이터가 있기 때문)
검색 자주 access 되는 노드를 루트 노드 가까이 배치할 수 있고, 루트 노드에서 가까울 경우, 브랜치 노드에도 데이터가 존재하기 때문에 빠름 리프 노드까지 가야 데이터 존재
링크드 리스트 없음 리프 노드끼리 링크드 리스트로 연결

 

데이터 삽입, 삭제 성능이 느린 이유

트리의 균형을 유지하면서 데이터를 삽입, 삭제해야 하기때문

삽입

  • 데이터를 삽입할 적절한 위치를 찾은 후 리프 노드에 삽입
  • 리프 노드가 가득 차 있으면 새로운 데이터를 삽입할 공간이 없기 때문에 노드는 분할되어야 하며 분할 후 중간 값이 부모 노드로 상승 되어야 함
  • 이 과정에서 부모 노드가 가득 차면 부모 노드도 분할되고 그 결과가 반복되며 트리의 높이가 증가할 수 있음
  • 최악의 경우 루트 노드까지 분할이 발생하여 트리의 높이가 하나 증가하는 일이 발생

삭제

  • 데이터가 포함된 노드를 찾고 제거한 후 해당 노드가 부족한 최소 키 수를 갖게 되면 병합이 필요할 수 있음
  • 노드가 부족해지면 인접한 형제 노드와 병합해야 함
  • 병합 작업은 트리의 균형을 맞추기 위해 추가적인 트리 재조정을 요구할 수 있음
  • 병합이 이루어지면 부모 노드에 영향이 가고 부모 노드의 키가 변경되거나 삭제되면 부모 노드도 재조정이 필요해질 수 있음. 이 때 발생하는 트리 재조정이 삭제 작업의 시간 복잡도를 증가시킬 수 있음
  • 병합이 불가능한 경우 형제 노드와 재배치가 일어날 수 있으며 이 작업도 부모 노드에 영향을 미칠 수 있어 부모 노드가 다시 변경될 수 있음
728x90
반응형

'DB' 카테고리의 다른 글

스레드 동시성 문제  (0) 2025.01.20
Partitioning  (0) 2025.01.18
Index Range Scan  (0) 2025.01.16
Index의 랜덤 I/O와 순차 I/O  (0) 2025.01.16
Multi-column Index  (0) 2025.01.16