某日,例行的打了一晚上牌之后开始焦虑。在知乎上翻到了 T 学长的 23 届小硕秋招分享-数据库/存储方向 - 知乎 ,于是决定开始学习数据库。
课程笔记
实验进度
与项目有关的八股文
2023 的改动
Project 0 是写一个 copy-on-write trie structure,在两周的时间里帮助学生快速入手 C++ 的智能指针、锁、继承、模版等等概念,从而为之后的 project 做准备。改 project 0 的想法上学期就有了,快到期末的时候我和其他助教讲了我的想法,要搞一个大的,做 "MVCC snapshot trie"。刚开始其他 TA 觉得很难,但实际写起来并没有多少代码,MVCC snapshot 也换成了 copy-on-write 这样更好理解的概念。从观感上来讲学期中因为不会写 C++ 而碰到问题来 office hour 或在 Piazza 上提问的学生比上学期少很多,所以下学期应该还会继续用这个 project。
Project 2 是写 B+ Tree,这是曾经公认的最难 project。上学期分析了学生写不出来的原因以后,发现可以用比较巧妙的写法来帮助大家写出正确的代码,因此今年加入了一个叫 page guard 的东西。原来的读写 B+ Tree page 的逻辑是,在读的情况下,先从 buffer pool manager 里面拿到这一页 (pin count +1),然后加读锁;在使用完成后,解锁并 unpin。由于各种原因,学生经常忘记在所有的分支路径下解锁用完的 page,导致一系列问题。今年新加入的 page guard 类似 Rust 里面的 MutexGuard
,持有 page guard 就意味着在使用某个 page,并且拿了这个 page 的锁。page guard 出使用范围则自动解锁并 unpin。这个改进给学生的学习体验带来了比较显著的提升,今年有 80% 的学生在这个项目里取得了满分,而去年只有 60%。
Project 3 加入了 hash join optimizer rule,难度比之前提升了一个等级。
别人是怎么把它写到简历的?
1. 牛客/成都理工/大三/ACMer
CMU15445 是基于现代 C++开发的支持并发操作的简单 SQL 操作的单机数据库。
底层基于 LRU-K 替换设计了 BufferPool,所有 page 操作在 Buffer Pool 上进行,Buffer Pool 采用了可扩属哈希表。
数据库建立在 B+tree 上,基于了 RAII 来管理释放 page,实现了在读写锁的基础上采用乐观与悲观的实现。
语句执行采用火山模型/迭代器模型,支持 SELECT,DELETE,UPDATE,JOIN,DISTINCT 等操作。
项目基于 cmake。,采用 gtest 进行单元测试,gdb 进行调试。
2. Bilibili/211 本/大三/ACMer
UP 主的修改建议
- CMU15-445/645 C++ 面向磁盘的关系型数据库 (OLTP)
- 技术点
- 通过所有测试样例要删除!!!做这个项目不是为了通过测试样例
- 体现你的思考
- perf 火焰图,性能优化,提升了多少,排行榜,QPS 达到了多少,怎么做的优化
- 分成两段写:
- 存储层:缓冲池,B+树,隔离级别
- SQL 层:执行引擎,算子实现
原始的简历描述
- CMU 15-445 是基于现代 C++开发的支持并发操作的简单 SQL 操作的单机数据库
- 实现了线程安全的支持 KV 形式存储的字典树
- 利用 lruk 策略实现缓存管理,实现了可扩展哈希表,利用可扩展哈希表存储数据库 page 到缓存池 frame 的映射
- 实现了多线程下 B+树索引的查找插入删除操作,利用火焰图进行性能瓶颈分析,优化 b+树性能,实现 RC,RR 隔离级别.
- 每个项目都通过了所有测试样例
My Resume
项目背景
数据库入门课程,基于 C++ 17 开发的面向磁盘的单机数据库,实验由 4 个 Project 组成:
- 采用 RAII 思想管理页面,实现 LRU-K 替换策略的缓冲池
- 设计并实现 B+树索引引擎
- 基于火山模型,实现增删查改、AGG、JOIN 等常用 SQL 算子
- 基于两阶段锁 (2PL),实现可重复读 (RR)、读已提交 (RC)、读未提交 (RU) 三种隔离级别
项目内容
在通过标准测试的基础上,进一步完成了缓冲池并发 I/O 优化、乐观策略的 B+树、常见查询计划优化(常量折叠、列裁剪、谓词下推、点查询优化等)等。Project 1/3/4 在 2023 CMU 15-445 的非本校学生排行中,达到前 10%。