본 내용은 유튜버 쉬운코드의 강의 "데이터베이스"를 참고하여 작성하였습니다.
왜 DB index로 B tree 계열이 사용되는가?
- B tree나 self-balancing BST 둘다 시간복잡도는 O(log N)
컴퓨터 시스템
- CPU : 프로그램 코드가 실제로 실행되는 곳
- Main memory(RAM) : 실행 중인 프로그램의 코드들과 코드 실행에 필요한 혹은 그 결과로 나온 데이터들이 상주하는 곳
- Secondary storage(SSD or HDD) : 프로그램과 데이터가 영구적으로 저장되는 곳, 실행 중인 프로그램의 데이터가 일부로 임시 저장되는 곳
- Main memory의 용량이 작으므로 Secondary storage에 있는 데이터와 swap 할 수도 있음.
- database도 여기에 저장됨.
Secondary storage의 특징
- 데이터를 처리하는 속도가 가장 느리다.
- 데이터를 저장하는 용량이 가장 크다.
- block 단위로 데이터를 읽고 쓴다. -> 불필요한 데이터까지 읽어올 가능성이 있음.
- block : file system이 데이터를 읽고 쓰는 논리적인 단위
- block의 크기는 2의 승수로 표현되며, 대표적인 block size는 4KB, 8KB, 16KB 등이 있다.
- DB에서 데이터를 조회할 때 secondary storage에 최대한 적게 접근하는 것이 성능 면에서 좋음.
- block 단위로 읽고 쓰기 때문에 연관된 데이터를 모아서 저장하면 더 효율적으로 읽고 쓸 수 있음. -> 그래서 B tree 사용
인덱스로 성능 비교하기 (AVL tree index(b) vs B tree index(b))
가정
- tree의 각 노드는 서로 다른 block에 있다고 가정
- 초기에는 root 노드를 제외한 모든 노드는 secondary storage에 있다고 가정
- 초기에는 데이터 자제도 모두 secondary storage에 있다고 가정
AVL tree | 5차 B tree | |
secondary storage | 4번 접근 | 2번 접근 |
자녀 노드 수 | 1~2개 | 3~5개 |
노드의 데이터 수 | 1개 | 2~4개 |
- 데이터를 찾을 때 탐색 범위를 빠르게 좁힐 수 있다.
- block 단위에 대한 저장 공간 활용도가 좋다.
101차 B tree 데이터 총 개수
최대 자녀 수 101 / 최대 key 수 100 / 최소 자녀 수 51 (* leaf 노드, root 노드 제외) / 최소 key 수 50 (* root 노드 제외)
Best case일 때 / Worst case일 때
Avg case일 때
- 265301 < 전체 데이터 수 < 104060400
- 네 개의 level만으로 수 백만, 수 천만 개의 데이터를 저장할 수 있다.
- root 노드에서 가장 멀리 있는 데이터도 세 번의 이동만으로 접근할 수 있다.
B tree 계열을 DB 인덱스로 사용하는 이유
- DB는 기본적으로 secondary storage에 저장된다.
- B tree index는 self-balancing BST에 비해 secondary storage 접근을 적게 한다.
- B tree 노드는 block 단위의 저장 공간을 알차게 사용할 수 있다.
self-balancing BST와 hash index를 쓰는 건?
- self-balancing BST의 노드들도 block 안에 최대한 담는다면?
-> 그게 결국 B tree 동작 방식 - hash index
-> 삽입/삭제/조회의 시간 복잡도가 O(1)이지만, equality(=) 조회만 가능하고 범위 기반 검색이나 정렬에는 사용될 수 없음.
'데이터베이스(쉬운코드)' 카테고리의 다른 글
30. DBCP(DB connection pool) (0) | 2025.02.10 |
---|---|
29. partitioning, sharding, replication (0) | 2025.02.10 |
27. B tree 2부 : 데이터 삭제 (1) | 2025.02.08 |
26. B tree 1부 : 개념, 특징, 데이터 삽입 (0) | 2025.02.07 |
25. DB 인덱스 (1) | 2025.01.30 |