[데이터베이스] Multilevel Indexes

adorableco·2023년 12월 13일

Multilevel Indexes

: blocking factor(=fanout) 을 늘림으로써, 남는 search space 를 줄이는 것

First level : index file 그 자체
Second level : first level에 대한 Primary index
Third level : second level에 대한 Primary index

ISAM : Indexed Sequential Access Method ➡️ ordering key field 에 따라 multilevel primary index 들이 정렬돼있는 것

왜 Dynamic 을 사용하는가?
➡️ ISAM 은 여전히 insertions 과 deletions 하기 어려움

해결방법 ⬇️

  • 각 index blocks 별로 새로운 엔트리 삽입을 위한 공간을 남겨둠
  • 적절한 insertion/deletion 알고리즘을 사용함



Search Trees

  • fanoutp 일때
    + 각 노드는 최대 p-1 개의 search 값을 가짐
    + p 개의 (node) pointer을 가짐
    + ex) fanout 이 3 이라면
    + | P_1 | value | P_2 | value | P_3 |
    + 2개의 search 값과 3개의 노드 포인터를 가짐



B+ -Tree : 가장 널리 사용되는 Index

Insert/Delete : logpNlog_pN

(p = fanout, N = # leaf pages)

  • 모든 leaf node 에 도달하는 시간이 ==height== 로 같음
  • 🔆 root node 를 제외하고 모든 노드는 50% 이상 채워져 있어야 함
  • 한 노드는 d <= m <= 2d 개의 엔트리를 가질 수 있음 (d=트리의 order)
    + ex) 3차 트리에서는 한 노드에 최대 6개까지 저정할 수 있음
  • Equalityrange-searches 를 효율적으로 지원함

Internal nodes : 바로 검색할 수 있도록. data records가 저장돼있는 것이 아님

Leaf nodes : data pointers 을 저장함

  • 서로 연결돼있음
  • search field 가 ==key field== 이면, data pointer 은 record를 가리킴
  • search field 가 ==nonkey field== 이면, data pointer 은 block을 가리킴

인덱스 엔트리 삽입하기

  1. leaf L 을 찾음
  2. L 에 충분한 공간이 있다면 DONE!
  3. L 에 공간이 없는 경우,
    1. L 을 쪼개야 함. (L 과 L2 로)
    2. 고르게 재분배를 한 후, middle key 를 부모 노드에 COPY UP
      1. COPY UP 하는 이유 : leaf node는 데이터를 실제로 저장하는 노드이므로 본인이 엔트리를 계속 지니고 있어야 함
    3. L2 를 가리키는 인덱스 엔트리를 L 의 부모 노드에 삽입함
  4. 반복
    1. index node를 쪼갤 때는, 엔트리들을 고르게 재분배하고 middle key 를 부모 노드에 PUSH UP ➡️ 현재 노드에는 남겨두지 않는 것
  5. root 를 쪼개면 height 가 늘어남
    1. Redistributing 함으로써 height을 유지할 수도 있음 BUT! ✅ DISK I/O 가 증가해서 실전에선 사용 X

인덱스 엔트리 삭제하기

  1. root부터 시작해서 해당 엔트리가 속해 있는 leaf L 을 찾음
  2. 엔트리를 삭제함
    1. L 이 최소 half-full 이라면 DONE!
    2. Ld-1 개 엔트리만 남았다면,
    1. 옆 형제 노트에게 엔트리를 빌려서 re-distribute
    1. 부모노드에는 삭제된 search key를 대신하여 새로운 key가 COPY UP
    2. 불가능하면 L 과 형제노드를 merge ➡️ L 의 부모노드에서 merge된 노드를 가리키는 엔트리를 삭제해야 함!
    3. merge가 root 노드까지 일어나면 height 가 줄어듦



B+ - Tree in Practice

  • Typical order : 100
    + Order = 최소 search values
    + 평균 fanout = 133 개

  • 보통 height 는 3~4

  • Top level (Root node) 는 항상 buffer pool 에 고정돼있어야 함

  • 대부분 sorted file 보다 성능 good

➕ B-tree와 B+ -tree 의 차이점 : B-tree 는 모든 노드에 레코드를 가지지만, B+ -tree는 오직 leaf node에서만 레코드 포인터를 가짐

profile
👩🏻‍💻

0개의 댓글