😉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 或者 false

  • GetMinSize():需要区分 1)根结点且为叶子结点。2)根结点。3)其他

b_plus_tree_internal_page.cpp 的实现

  • MappingType 的类型为 std::pair<KeyType, ValueType>,如何获取第 iMappingType?=> 在其头文件有一个 arrayMappingType 数组(array[0] 表示这是一个弹性数组)

  • 注意有些函数需要判断 index 是否合法,使用 assert()

  • bpm 取出的页面转换为 internal page/leaf page(重要)

b_plus_tree_internal_page.cpp
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 或者 false
  • Helper method

  • Lookup

  • Insertion

  • Remove

  • Split and Merge utility methods

注:MergeRedistribute 的几个函数可以放在 CP2 中完成

b_plus_tree_Leaf_page.cpp 的实现

  • Helper method

  • Insertion、Search、Delete

  • Split and Merge utility methods

吐槽:上面的四个 Move 函数和 BPlusTreeInternalPage 类中的同名函数参数不一致,导致后面 Split 中调用报错。之后我将这一组函数的参数改为一致才编译通过。


  • 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