logo

B+트리

B+ Tree는 효율적인 삽입, 삭제, 검색 작업을 가능하게 하는 B Tree의 확장입니다.

B 트리에서는 키와 레코드가 모두 내부 노드와 리프 노드에 저장될 수 있습니다. 반면 B+ 트리에서는 레코드(데이터)가 리프 노드에만 저장되고 내부 노드에는 키 값만 저장됩니다.

B+ 트리의 리프 노드는 단일 연결 목록 형태로 함께 연결되어 검색 쿼리를 보다 효율적으로 만듭니다.

B+ Tree는 메인 메모리에 저장할 수 없는 대용량 데이터를 저장하는데 사용됩니다. 주 메모리의 크기는 항상 제한되어 있기 때문에 B+ 트리의 내부 노드(기록에 액세스하는 키)는 주 메모리에 저장되고 리프 노드는 보조 메모리에 저장됩니다.

B+ 트리의 내부 노드는 종종 인덱스 노드라고 불립니다. 다음 그림은 3차 B+ 트리를 보여줍니다.


B+트리

B+트리의 장점

  1. 동일한 수의 디스크 액세스로 레코드를 가져올 수 있습니다.
  2. 트리의 높이는 균형을 유지하며 B 트리에 비해 작습니다.
  3. B+ 트리에 저장된 데이터에 직접 접근할 수도 있고 순차적으로 접근할 수도 있습니다.
  4. 키는 인덱싱에 사용됩니다.
  5. 데이터가 리프 노드에만 저장되므로 검색 쿼리가 더 빨라집니다.
B+트리의 장점

B 트리 VS B+ 트리

SN B 트리 B+트리
1 검색키는 반복적으로 저장할 수 없습니다. 중복된 검색 키가 존재할 수 있습니다.
2 데이터는 리프 노드와 내부 노드에 저장될 수 있습니다. 데이터는 리프 노드에만 저장할 수 있습니다.
데이터는 리프 노드뿐만 아니라 내부 노드에서도 찾을 수 있으므로 일부 데이터를 검색하는 속도가 느려집니다. 리프 노드에서만 데이터를 찾을 수 있으므로 검색이 비교적 빠릅니다.
4 내부 노드를 삭제하는 것은 매우 복잡하고 시간이 많이 걸립니다. 요소는 항상 리프 노드에서 삭제되므로 삭제 과정은 결코 복잡하지 않습니다.
5 리프 노드는 서로 연결될 수 없습니다. 리프 노드는 서로 연결되어 검색 작업을 보다 효율적으로 만듭니다.

B+ 트리에 삽입

1 단계: 새 노드를 리프 노드로 삽입

2 단계: 리프에 필요한 공간이 없으면 노드를 분할하고 중간 노드를 다음 인덱스 노드에 복사합니다.

3단계: 인덱스 노드에 필요한 공간이 없으면 노드를 분할하고 중간 요소를 다음 인덱스 페이지에 복사합니다.

예 :

다음 그림에 표시된 순서 5의 B+ 트리에 값 195를 삽입합니다.


B + 트리

195는 190 이후 120의 오른쪽 하위 트리에 삽입됩니다. 원하는 위치에 삽입합니다.


B + 트리

노드에는 최대 요소 수(예: 4)보다 많은 요소가 포함되어 있으므로 이를 분할하고 중앙값 노드를 상위 노드에 배치합니다.


B + 트리

이제 인덱스 노드에는 B+ 트리 속성을 위반하는 6개의 하위 항목과 5개의 키가 포함되어 있으므로 다음과 같이 분할해야 합니다.


B + 트리

B+ 트리에서 삭제

1 단계: 리프에서 키와 데이터를 삭제합니다.

2 단계: 리프 노드에 최소 개수보다 적은 요소가 포함되어 있으면 형제 노드와 노드를 병합하고 그 사이에 있는 키를 삭제합니다.

3단계: 인덱스 노드에 최소 개수보다 적은 요소가 포함되어 있으면 노드를 형제 노드와 병합하고 그 사이의 키를 아래로 이동합니다.

다음 그림에 표시된 B+ 트리에서 키 200을 삭제합니다.


B + 트리

200은 190의 오른쪽 하위 트리에 195 이후에 존재합니다. 삭제하세요.


B + 트리

195, 190, 154 및 129를 사용하여 두 노드를 병합합니다.


B + 트리

이제 요소 120은 B+ 트리 속성을 위반하는 노드에 존재하는 단일 요소입니다. 따라서 60, 78, 108, 120을 사용하여 병합해야 합니다.

이제 B+ 트리의 높이가 1씩 감소합니다.


B + 트리