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(递归)