ByteYoungDB实操课笔记|青训营笔记

153 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记

  1. 在ubuntu中安装报错,重新编译sql-parser后问题解决
Undefined reference to process(std::__cxx11::basic_string ... ) 
  1. 我们目标是开发内存态数据库,为了防止内存碎片化的问题,一次申请一批内存,用两个list,一个是DataList用来存数据,一个是FreeList用于存暂时不用的数据,用数据时从FreeList中取一个node,然后写数据,插入到DataList。其实MySQL也是每次申请一个16k的页面。MySQL最开始向操作系统申请128M,然后自己进行内存管理。

  2. 事务引擎(本项目暂时不考虑并发和持久化):底层数据结构是栈,用来实现undo记录和回滚,更新时执行入栈操作

  3. 项目代码讲解

    • CMakeList.txt: DEBUG O0 就是不优化, O2编译器会帮忙做一些优化, O2大概会比O0优化个两三倍
    • .clang-format工具可以批量把代码刷一下,保证代码格式
    • cloc 统计代码行数
    • 先从main函数开始,main里有一个死循环不断读取输入,直到遇到q或者exit,对于读入的sql命令,先用parser用来词法和语法解析还有语义分析,得到SQLParserResult,然后用optimizer得到plan(树形结构),然后进入executor
    • 此处plan类似链表(只有next),optimizer相当于只是生成了plan这个结构,而没有做过多的优化
    • 执行器用火山模型实现,也就是只有一个exec作为对外接口,在执行器中首先init(),也就是根据plan生成相应的opertaor
    • 存储引擎:根据表的元信息计算Tuple中的data的大小,data是char数组的形式,这样泛化性更好。插入数据时首先查看FreeList是否有空,没有就申请100个空的Tuple
    • 事务引擎:插入Undo只需要记录当前tup,删除只需要记录以前的undo,更新的需要记录之前和当前的tup