CS
[DB] b-tree, b+tree
soom22
2024. 2. 4. 22:18
SMALL
B-tree란?
- Balanced-Tree
- 균형 트리로 루트로부터 리프까지의 거리가 일정한 트리 구조
- 이렇게 균형을 유지할 경우 어떤 데이터를 검색할 때 빠른 속도로 데이터 검색 가능
- 00차 트리 → 최대 자식수가 00개
B-트리의 특징
- B트리는 이진트리와 다르게 하나의 노드에 많은 수의 정보를 가질 수 있습니다. 최대 M개의 자식을 가질 수 있는 B-트리를 M차 B-트리라고 합니다.
- 노드는 최대 M개의 자식 노드를 가질 수 있다.
- ex) 3차 B-트리라면 최대 3개의 자식 노드를 가질 수 있다.
- 노드에는 최대 M-1개의 KEY를 가질 수 있다.
- ex) 3차 B-트리라면 최대 2개의 KEY를 가질 수 있다.
- 각 노드는 최소 M/2개의 자식 노드를 가진다. (루트 노드와 leaf 노드 제외)
- ex) 3차 B-트리라면 각 노드는 최소 2개의 자식 노드를 가진다.
- 각 노드는 최소 M/2-1개의 키를 가진다. (루트 노드 제외)
- ex) 3차 B-트리라면 각 노드는 최소 1개의 키를 가진다.
- internal 노드의 KEY가 x개라면 자녀 노드의 수는 언제나 x+1 개다.
- 노드가 최소 하나의 KEY는 가지기 때문에 몇 차 인지에 상관없이 internal 노드는 최소 두개의 자녀는 가진다.
- 노드에 KEY들은 항상 정렬된 상태로 저장된다.
단점
- 만약 트리의 노드가 수정되어야 한다면 재정렬을 해줘야 하기 때문에 수정시 불리
- insert, delete등이 힘들어진다.
- ex)분할이 일어나지 않는 경우
- ex)분할이 일어나는 경우
- ex)분할이 일어나지 않는 경우
- 가장 큰 단점은 바로 시퀀셜 액세스에 취약하다는 점.
- 데이터를 가져올 때 range를 정해놓고 속하는 데이터를 가져오는 작업에서는 어려움
- 아래와 같은 구조에서 데이터 액세스를 시도한다면, 기본적으로 B-Tree는 루트부터 하향식으로 데이터를 찾아가기 때문에 복잡해짐. 게다가 실제 데이터는 입력 순서대로 저장되어 있지도 않기 때문에 이렇게 흩뿌려져 있는 데이터를 정렬된 형태로 보여주는 작업은 매우 복잡합니다.
B+tree
- **리프 노드를 제외하고 값을 담아두지 않기 때문에 하나의 블록에 더많은 Key 들을 담아 둘 수 있다(**트리의 높이가 낮아짐)
- 풀 스캔시 B+Tree는 리프 노드에 데이터가 모두 있기 때문에 한번의 선형 탐색만 하면 되기 때문에 B-Tree 에 비해 빠르다
- 같은 레벨의 노드에서는 Double Linked List 를 사용하고 자식 노드는 Single Linked List 를 사용합니다.
- b-트리의 단점이던 시퀀셜 액세스도 무난함
B-tree와 B+tree의 비교
B-tree | B+tree | |
주요 특징 | 모든 내부, 리프 노드들이 데이터를 가진다 | 단지 리프노드만 데이터를 가진다 |
검색 | 모든 키가 리프에서 사용가능 하지 않기 때문에, *검색이 때로 느리다 | 모든 키가 리프 노드에 있기 때문에 검색이 빠르고 정확하다 |
중복 키 | 트리에 중복키가 없다 | 중복키가 존재하며 모든 데이터들은 리프에 있다 |
삭제 | 내부 노드의 삭제는 목잡하고 트리 변형이 많다 | 어떠한 노드든 리프에 있기 때문에 삭제가 쉽다 |
리프노드 | 링크드 리스트로 저장되지 않는다 | 링크드 리스트로 저장된다 |
높이 | 특정 갯수의 노드는 높이가 높다 | 같은 노드일 때 B-tree보다 높이가 낮다 |
사용 | 데이터베이스, 검색엔진 | 멀티레벨 인덱스, DB 인덱스 |
*검색에 대한 부가설명
- 적은 양을 찾기에는 b-tree가 빠르고
- 연속적인 데이터, 즉 시퀀셜 데이터를 찾을때는 b+tree가 빠르다고 이해함