【CMU15-445 Project #2】B+Tree

Checkpoint #1

task #1

二分查找
  [K0, V0(pre_page)] [K1, V1] .... [Kn, Vn] [next_page]
  在[K1, V1] ... [Kn, Vn] 中找到第一个大于等于key值的编号i
  使得, key <= Ki
  那么,key就需要插到i位置,而[Ki, Vi] 一直到 [Kn, Vn] 都需要往后挪一位

叶子节点
  [K0, V0(pre_page)] [K1, V1] .... [Kn, Vn] [next_page]
  [K1, V1]...[Kn, Vn]是n个KV对, key存的是建立索引键的值,value存的是数据行的内容/数据行的主键值

  插入情况;
    [K1, V]
  [K0, V0] [K1, V1] .... [Kn, Vn] [Kn+1, Vn+1] [next_page]

  拆分成两个部分
  
    [K1, V]
  block1: [K0, V0(pre_page)] [K1, V1] ... [Kmid, Vmid] [next_page]
    [Kmid+1, V]
  block2: [K0, V0(pre_page)] [Kmid+1, Vmid+1] ... [Kn+1, Vn+1] [next_page]


内部节点
  [K0, V0(pre_page)] [K1, V1] [K2, V2] [K3, V3] .... [Kn, Vn]

  V0 指向的 page 的 key 都大于等于K0(-inf),小于K1

  V1 指向的 page 的 key 都大于等于K1, 小于K2

  Vn 指向的 page 的 key 都大于等于Kn,小于Kn+1(+inf)


  插入情况:
              [K0, V0]
  
  [K0, V0] [K1, V1] ... [Kn+1, Vn+1]
  
  拆分成两个部分
              [K0, V0]
  block1: [K0, V0] [K1, V1] ... [Kmid, Vmid]
              [Kmid+1, V1]
  block2: [Kmid+1, Vmid+1] ... [Kn+1, Vn+1]

  


该函数的作用是往叶子页面上添加KV对
如果页面已经满了(size是指array_这个kv对的数目,但实际上第一个kv对的value是指向上一个page_id,也就是说,存入的有效kv对的数目是max_size - 1)
  size == max_size_
  需要分裂(此时将所有需要存入的kv取出来,长度为cnt = max_size + 1,排好序)
  if cnt % 2 == 0,创建一个新的页面,均分

    调用parent page的插入函数,插入[]
  if cnt % 2 != 0,创建一个新的页面,分两部分,前一个部分多一个



插入操作 = 叶子页面的插入操作 + 内部页面的插入操作
插入操作:
  如果连root根页面都没有,就生成一个
  先从root开始查找,找到需要插入的leaf_node
  调用叶子页面的插入操作

叶子页面插入操作:
  调用leaf_node的插入操作,插入kv
    如果成功,则可以返回啦
    如果失败,则利用bpm申请一个新的页面
      将原页面的数据重新分配
    调用parent_page的内部页面插入操作,插入kv
内部页面插入炒作:
  调用inner_node的插入操作,插入kv
    如果成功,则可以返回啦
    如果失败,则利用bpm申请一个新的页面
      将原页面的数据重新分配
    调用parent_page的内部页面插入操作,插入kv(递归)
posted @ 2022-10-07 20:18  PinganT  阅读(49)  评论(0)    收藏  举报