- 완전 이진 트리의 높이가 최대 O(log(n))
- 즉, 탐색을 안정적으로 할 수 있는 장점이 있는 자료구조
- 그런데 이것보다 DB에서 사용하기 더 좋은 자료구조가바로
- Balance Tree(B-Tree)
- Binary Search Tree(BST)를 확장한 형태
- 이진 탐색 트리를 일반화
- 하나의 노드가 여러 개의 키를 가질 수 있는 균형트리
- 모든 리프 노드가 동일한 레벨에 존재
- 각 노드는 자식 노드에 대한 포인터 포함
- 다음과 같은 특징
- 다중 키 저장: 각 노드는 여러개 키 포함하며, 키들은 오름차순으로 정렬되있음
- 자식 노드 분할: 노드의 키 개수가 N개 라면, 해당 노드는 최대 N+1 개의 자식 노드 가질 수 있음
- 최대 M개의 자녀 가질 수 있는 B Tree를 M차 B Tree라 부름
- 각 노드의 최대 key 수는 M-1
- 균형 유지: 모든 리프 노드는 동일한 레벨에 위치하여 트리의 균형을 유지
- 각 노드 최소 Key 수
- ((올림)(M/2)-1)
- 이진 탐색 트리에 비해 다음과 같은 장점
- 낮은 트리 높이: 한 노드에 여러 키 저장하므로, 트리의 높이 낮아짐. 이는 탐색 시 거쳐야 하는 노드 수 줄여줌
- 효율적인 범위 검색: 키들이 정렬되어 있어 범위 검색이 용이
- 디스크 I/O 감소: 한 노드에 많은 키와 자식 포인터 저장하므로, 디스크 접근 횟수 줄어듬
- 완전 이진 트리(Complete Binary Tree) 의 탐색 비용은 O(log(N))
- 이진 탐색이 이루어 지므로 한 노드마다 최대 두갈래 분할
- 높이 = O(log_2(N))
- B-Tree 탐색 비용은 O(logmN)
- 높이 = O(logmN)(m은 B-Tree 의 branching factor)
- 삽입(추가)
- 추가는 항상 리프 노드에 한다
- 노드가 넘치면 가운데(median) key 기준으로 좌우 key들은 분할하고 가운데 key는 승진
- M-1개보다 더 많은 키를 가진경우를 노드가 넘친다 표현

- M-1개보다 더 많은 키를 가진경우를 노드가 넘친다 표현
B + Tree!
- B-Tree를 한층더 개선
- InnoDB에서 인덱스 관리에 이걸 씀
- 검색이 더 빠르고 범위 검색에 유용하다는 특징
- 차이는 바로! 리프 노드간의 연결성이 추가된 자료구조
- 하나의 리프 노드 위치 알면 그걸로 나머지 값도 탐색이 가능
B- B+차이
- 메모리 효율
- B-Tree
- 각 노드에 데이터 주소값 뿐만 아니라 실제 데이터도 오름차순으로 정렬되어 저장
- B+Tree
- 리프 노드에만 실제 데이터 저장
- 따라서, B+Tree 가 메모리 효율 측면에서 더 좋다
- B-Tree
- 생성 및 삭제 효율
- B+Tree는 리프 노드 간의 연결을 나타내는 데이터도 추가로 관리해야함. 따라서, 데이터의 생성, 수정, 삭제가 일어날때 B-Tree 보다 더 많은 오버헤드 발생
왜 트리 씀? 해시 쓰면 안되나?
- 바로 범위 검색 때문
- 우리가 보통 수행하는 검색 패턴은 범위 검색
B Tree 계열 자료구조 시간복잡도
B+Tree, B*Tree 등 B Tree 계열은 avg case, worst case 모두 O(log n)
BST일반화 → B Tree BST는 편향될경우 O(n) 이 됨
시간복잡도가 동일한데 왜 DB Index로 B Tree가 사용되는가?
- 내가볼땐, 한 노드에 키값이 여러개 들어갈수있어서 보조 기억 장치 히트를 덜하기때문?
- AVL(BST) 보다 자녀를 많이 가질 수 있어서 데이터 찾을때 탐색 범위를 빠르게 좁힐 수 있다.
- 동일 조건에서 높이가 낮다.
- 한 노드에서 여러게의 키(뎅티ㅓ)가질 수 있음
- 한 노드 데이터 많이가져오기에 그 노드를 불러올때 블락단위로 불러올때 한 블라의 공간활용도가 더 좋을 수 있다. 노드통째로 블락단위에 속할수있음.
- 쉬코님!
- B Tree index는 self-balancing BST에 비해 보조 기억 장치에 접근 적제함
- B Tree 노드는 블록 단위의 저장 공간을 알차게 사용 가능 보조 기억 장치(secondary storage)
- block 단위로 데이터 읽고 쓴다
- file system이 데이터를 읽고 쓰는 논리적 단위
- block 크기는 2의 승수로 표현
- 대표적인 block size는 4KB, 8KB, 16KB 등
- 단점
- 블락단위이기에 필요한 데이터 뿐만아니라 주변의 데이터까지 읽어오는 단점 존재 성능적인 측면에서 DB에서 조회시 보조 기억 장치에 최대한 적게 접근하는게 좋다