😉B+ Tree Index
PROJECT #2 - B+TREE
索引负责快速地检索数据,而不需要搜索数据库表中的每一行;索引还提供了快速的随机访问以及高效地访问有序记录。因此,在这个编程作业中,我们需要实现基于 B+ 树的动态索引结构。
CHECKPOINT #1
TASK #1 - B+TREE PAGES
实现三个 Page 类来存储 B+ 树的数据
B+Tree Parent Page
B+Tree Internal Page
B+Tree Leaf Page
b_plus_tree_page.cpp 的实现
直接根据函数要求设置或返回对应的字段即可。
IsRootPage函数根据parent_id_是否是INVALID_PAGE_ID返回true或者falseGetMinSize():需要区分 1)根结点且为叶子结点。2)根结点。3)其他
b_plus_tree_internal_page.cpp 的实现
MappingType的类型为std::pair<KeyType, ValueType>,如何获取第i个MappingType?=> 在其头文件有一个array的MappingType数组(array[0]表示这是一个弹性数组)注意有些函数需要判断
index是否合法,使用assert()将
bpm取出的页面转换为internal page/leaf page(重要)
Page *page = buffer_pool_manager_->FetchPage(page_id);
assert(page != nullptr);
// 将 page 转成 BPlusTreeInternalPage 类
BPlusTreeInternalPage *bpt_node = reinterpret_cast<BPlusTreeInternalPage *>(page->GetData());
// do something
buffer_pool_manager_->UnpinPage(bpt_node->GetPageId(), flag); // 是否修改了页面,flag 为 true 或者 falseHelper method
Lookup
Insertion
Remove
Split and Merge utility methods
注:Merge 和 Redistribute 的几个函数可以放在 CP2 中完成
b_plus_tree_Leaf_page.cpp 的实现
Helper method
Insertion、Search、Delete
Split and Merge utility methods
吐槽:上面的四个 Move 函数和 BPlusTreeInternalPage 类中的同名函数参数不一致,导致后面 Split 中调用报错。之后我将这一组函数的参数改为一致才编译通过。
TASK #2.A - B+TREE DATA STRUCTURE (INSERTION & POINT SEARCH)
FindLeafPage这个函数是查找、插入、删除操作的基础,它是找到key所在的叶子节点,leftMost = true时表示返回 B+ 树中最左边的叶子节点在
InsertIntoLeaf函数中,如果插入后,叶子结点包含的<K, V>个数等于GetMaxSize(),此时就要进行分裂在
InsertIntoParent函数中,插入后的中间结点包含的<K, V>个数大于GetMaxSize()才进行分裂
CHECKPOINT #2
TASK #3 - INDEX ITERATOR
迭代器的实现主要是注意什么时候结束?(到达最右边叶子节点的最后一个 slot)以及实现
++操作时,处理下一个叶子节点的情况。
TASK #4 - CONCURRENT INDEX
coalesce或者redistribute操作时需要获得 sibling 的W Latch为了保护
root_page_id_,采用了虚拟页v_root_page,和一个mutex_
Crabbing Locking(解锁顺序和加锁顺序要一致)
测试/验证/打包
测试
格式验证
打包
然后前往 https://www.gradescope.com 提交代码
Last updated