在做实验2之前请确保实验1结果的正确性。不然你的实验2将无法正常进行
环境搭建地址如下 https://www.cnblogs.com/JayL-zxl/p/14307260.html
实验一的地址如下 https://www.cnblogs.com/JayL-zxl/p/14311883.html
实验的地址如下 https://15445.courses.cs.cmu.edu/fall2020/project2/
0. 写在前面Lab2真的好难写啊。写了好几天(虽然中间有回家、做核酸、出去玩。。各种的事情)但还算是写完了。真的参考了好多代码(这里建议大家有问题还是Google),最后勉强写完了真的不容易,下面记录一下我实验的过程。(写的超烂)
1. 实验介绍第一个打分点---实现b+树的基本结构、插入、搜索操作
注意这里没有考虑打分点2的并发问题,所以对于加锁、解锁和事物都没有考虑。
第二个打分点--实现b+树的删除操作、索引迭代器和对并发访问的支持
Task 1 B+TREE PAGES您需要实现三个页面类来存储B+树的数据。
B+ Tree Parent Page
B+ Tree Internal Page
B+ Tree Leaf Page
1. B+ Tree Parent Page这是内部页和叶页都继承的父类,它只包含两个子类共享的信息。父页面被划分为如下表所示的几个字段。
B+Tree Parent Page Content
Variable Name Size Descriptionpage_type_ 4 Page Type (internal or leaf)
lsn_ 4 Log sequence number (Used in Project 4)
size_ 4 Number of Key & Value pairs in page
max_size_ 4 Max number of Key & Value pairs in page
parent_page_id_ 4 Parent Page Id
page_id_ 4 Self Page Id
您必须在指定的文件中实现您的父页。您只能修改头文件(src/include/storage/page/b_plus_tree_page.h) 和其对应的源文件 (src/storage/page/b_plus_tree_page.cpp).
2. B+TREE INTERNAL PAGE内部页不存储任何实际数据,而是存储有序的m个键条目和m + 1个指针(也称为page_id)。 由于指针的数量不等于键的数量,因此将第一个键设置为无效,并且查找方法应始终从第二个键开始。 任何时候,每个内部页面至少有一半已满。 在删除期间,可以将两个半满页面合并为合法页面,或者可以将其重新分配以避免合并,而在插入期间,可以将一个完整页面分为两部分。
你只能修改头文件(src/include/storage/page/b_plus_tree_internal_page.h) 和对应的源文件(src/page/b_plus_tree_internal_page.cpp).
* Internal page format (keys are stored in increasing order): * -------------------------------------------------------------------------- * | HEADER | KEY(1)+PAGE_ID(1) | KEY(2)+PAGE_ID(2) | ... | KEY(n)+PAGE_ID(n) | * -------------------------------------------------------------------------- #define INDEX_TEMPLATE_ARGUMENTS template <typename KeyType, typename ValueType, typename KeyComparat>B+TREE LEAF PAGE
叶子页存储有序的m个键条目(key)和m个值条目(value)。 在您的实现中,值只能是用于定位实际元组存储位置的64位record_id,请参阅src / include / common / rid.h中定义的RID类。 叶子页与内部页在键/值对的数量上具有相同的限制,并且应该遵循相同的合并,重新分配和拆分操作。您必须在指定的文件中实现内部页。 仅允许您修改头文件(src / include / storage / page / b_plus_tree_leaf_page.h)及其相应的源文件(src / storage / page / b_plus_tree_leaf_page.cpp)。
重要提示:尽管叶子页和内部页包含相同类型的键,但它们可能具有不同类型的值,因此叶子页和内部页的最大大小可能不同。每个B + Tree叶子/内部页面对应从缓冲池获取的存储页面的内容(即data_部分)。 因此,每次尝试读取或写入叶子/内部页面时,都需要首先使用其唯一的page_id从缓冲池中提取页面,然后将其重新解释为叶子或内部页面,并在写入或删除后执行unpin操作。
Task 2.A - B+TREE DATA STRUCTURE (INSERTION & POINT SEARCH)您的B +树索引只能支持唯一键。 也就是说,当您尝试将具有重复键的键值对插入索引时,它应该返回false
对于checkpoint1,仅需要B + Tree索引支持插入(Insert)和点搜索(GetValue)。 您不需要实现删除操作。 插入后如果当前键/值对的数量等于max_size,则应该正确执行分割。 由于任何写操作都可能导致B + Tree索引中的root_page_id发生更改,因此您有责任更新(src / include / storage / page / header_page.h)中的root_page_id,以确保索引在磁盘上具有持久性 。 在BPlusTree类中,我们已经为您实现了一个名为UpdateRootPageId的函数。 您需要做的就是在B + Tree索引的root_page_id更改时调用此函数。