B+ Tree
실제 데이터베이스의 indexing은 B+트리로 이루어져 있음
search에 있어서 매우~ 유리함.
- internal nodes: Index nodes (다음 노드를 가리킬 수 있는 포인터 주소가 존재)
- leaf nodes: Data nodes (실제 데이터)
- 모든 key, data가 리프노드에 모여있음 (B트리는 리프노드가 아닌 각자 key마다 data를 가진다면, B+트리는 리프 노드에 모든 data를 가짐)
- 모든 리프노드가 연결리스트의 형태를 띄고 있음 (B트리는 옆에있는 리프노드를 검사할 때, 다시 루트노드부터 검사해야 한다면, B+트리는 리프노드에서 선형검사를 수행할 수 있어 시간복잡도가 굉장히 줄어듦)
- 리프노드의 부모 key는 리프노드의 첫번째 key보다 작거나 같음
*첫 번째 그림과 같이 leaf nodes가 linked list로 연결된 경우도 있음. 이 경우, 다른 leaf node에 접근하기 위해 다시 root를 방문하지 않아도 됨. 그러나 결국 background operation에 의한 비용을 감당해야하지만, 분명한 이득이 있음
Dis Friendliness of B+Tree
1. 페이지 기반 접근
B+tree는 데이터를 페이지 단위로 저장 (페이지는 일정한 크기의 데이터 블록)
페이지 기반 접근을 통해, 디스크에서 데이터를 읽거나 쓸 때마다 필요한 데이터만 읽거나 쓸 수 있음.
ex)
데이터 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
이 데이터를 페이지 단위로 저장하면, 다음과 같이 3개의 페이지로 나눌 수 있음
```
페이지 1: 1, 2, 3
페이지 2: 4, 5, 6
페이지 3: 7, 8, 9, 10
```
이 경우, 디스크에서 데이터를 읽거나 쓸 때마다 필요한 데이터만 읽거나 쓸 수 있는데, 예를 들어, 데이터 2를 읽으려면 페이지 1만 읽으면 됨
2. 분산 저장
B+tree는 데이터를 루트 노드, 중간 노드, 리프 노드로 분산하여 저장함.
루트 노드는 메모리에 저장되고, 중간 노드와 리프 노드는 디스크에 저장됨.
루트 노드에는 데이터의 위치 정보가 저장되어 있기 때문에, 디스크에서 데이터를 찾을 때는 먼저 루트 노드에서 데이터의 위치 정보를 찾음.
예를 들어, 위의 데이터를 B+tree에 저장하면 다음과 같이 저장됨
```
루트 노드: 1, 4, 7
중간 노드 1: 2, 5, 8
중간 노드 2: 3, 6, 9, 10
리프 노드 1: 1, 2
리프 노드 2: 3, 4
리프 노드 3: 5, 6
리프 노드 4: 7, 8
리프 노드 5: 9, 10
```
이 경우, 디스크에서 데이터를 찾을 때는 먼저 메모리의 루트 노드에서 데이터의 위치 정보를 찾음. 데이터의 위치 정보를 찾으면, 해당 위치의 리프 노드에서 데이터를 찾을 수 있음.
3. 균형 잡힌 트리
B+tree는 균형 잡힌 트리이기 때문에, 데이터를 효율적으로 저장하고 검색할 수 있음. 균형 잡힌 트리는 트리의 높이가 낮기 때문에, 데이터를 찾기 위해 디스크를 읽거나 쓸 때 필요한 I/O 횟수가 적음.
출처
https://ssocoit.tistory.com/217
'개발 > CS study' 카테고리의 다른 글
[CS] 메모리 계층 구조 / B tree (2) | 2023.12.07 |
---|---|
[SSP] 벨만 포드 알고리즘 (1) | 2023.12.03 |
[CS] 데이터 타입, bit, byte, Data type, 아스키코드 (1) | 2023.11.23 |
[알고리즘] DFS를 통한 SCC 찾기 (0) | 2023.11.22 |
[자료구조] Red Black Tree (레드블랙트리) (0) | 2023.11.07 |