
SImpleDB
文章平均质量分 61
kkzz1x
真.新手起步
Java + CPP + Rust(新人),计算机科学热爱者
展开
-
【SimpleDB】Part 9 - Binary Search and Duplicate Keys
增加功能: 按照主键有序排列; 消除主键冲突一、概述现在我们插入记录时依旧是在表的最后插入,因此数据记录是无序的。在这一节中,我们要找到table中正确的位置去插入。如果这个位置已经有要插入的key,报错(说明主键已经存在)...原创 2022-05-18 14:22:49 · 133 阅读 · 0 评论 -
【SimpleDB】Part 7-8 - Introduction to the B-Tree
一、概述为什么树对于DB是一个好的数据结构?查找数据更快插入/删除数据更快范围查找更快(这是比哈希表更优的地方)二、B-tree vs B+ tree在sqlite中,索引使用B树,而存储表格使用B+树B+树的非叶子结点只存keys,而不存values;B树则存k-v,叶子结点和非叶子结点的结构是一致的。B+树的非叶子节点vs叶子节点三、改造成B-树叶子结点不止存储一行数据,因此一个node可能需要包含元数据、主键、记录本身。对原来的设计(数组存储),每个page只存储r原创 2022-05-18 13:57:04 · 146 阅读 · 0 评论 -
【SimpleDB】Part 6 - The Cursor Abstraction
在这一节中,我们要增加一个“游标 Cursor”属性游标出现场景:在表的开始创建Cursor在表的结尾创建Cursor通过指定Cursor访问数据增加一行数据时Cursor值也要增加具体如下:删除游标指向的记录修改游标指向的记录搜索游标指向的记录数据结构定义以及初始化:typedef struct { Table* table; uint32_t row_num; bool end_of_table; // Indicates a position one pas原创 2022-05-15 11:55:37 · 118 阅读 · 0 评论 -
【SimpleDB】Part 5 - Persistence to Disk
之前的一通insert、select的操作范围还仅仅只停留在程序运行时的内存中。当结束运行后,我们的insert数据就会丢失。这节就是将我们的数据写到文件中。之前已经完成了Core部分,然后是Backend部分。就像sqlite一样,我们将整个数据库保存到文件中。我们已经将记录serialize到内存页中,为了持久化,我们的思路如下:将这些内存页写入到文件中在程序启动时,将内容从文件中读出来。方便起见,我们定义(抽象)一个结构pager。从pager中可以获得page number x,pag原创 2022-05-15 11:30:05 · 271 阅读 · 0 评论 -
【SimpleDB】Part 4 - Our First Tests (and Bugs)
本节主要是修复一些bug:row定义时存储结构的处理+ char username[COLUMN_USERNAME_SIZE + 1];+ char email[COLUMN_EMAIL_SIZE + 1];因为在C字符串尾部会有一个’\0’结束符,所以分配空间的时候需要多分配一个byte增加字段长度过长时的报错;id不能为负修改我们的菜鸟compiler:使用strtokstrtok用法:分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符(如果传入字符串,则传原创 2022-05-14 12:36:43 · 122 阅读 · 0 评论 -
【SimpleDB】Part 3 - An In-Memory, Append-Only, Single-Table Database
一、概述论这个DB为啥是个toyDB><有以下限制:只支持两个操作:插入一行/打印全表表只放在内存中支持单个、硬编码的表支持的语法:insert 1 cstack foo@bar.cominsert 字段1 字段2 字段3因此要对我们的“ttttoy compiler”补充一些内容:...原创 2022-05-14 00:03:39 · 234 阅读 · 0 评论 -
【SimpleDB】Part2 - World‘s Simplest SQL Compiler and Virtual Machine
一、概述sqlite的前端是一个SQL 编译器,能够将我们的字符串解析成字节码,传给VM;VM负责字节码的执行。将编译,执行分离的优点:减少了每一步的复杂性(VM不用处理语法错误啦)编译一次,执行多次(缓存字节码)二、代码实现类似于.exit的非SQL语句我们将它称为“meta-commands”,实现的时候先检查这些非SQL语句,然后用单独模块处理。第二步,将我们输入的语句进行预处理。(显然之后还要处理)最后,我们将上述锁的的预处理语句传给execute_statemen原创 2022-05-13 09:46:36 · 148 阅读 · 0 评论 -
【SimpleDB】Part 1 - Introduction and Setting up the REPL
开始写一个简单的db,https://cstack.github.io/db_tutorial/parts/part1.html,参考。可以算是toy了,不过希望能借此开始db生涯。一、总览查询语句经过的部件前端有Tokenizer、Parser、Code Generator后端有virtual machine、B-Tree、Pager、OSInterfacevirtual machine接收前端生成查询计划后的字节码,生成指令,可以对表或者索引进行操作,表和索引存在B+树的结点中。VM本质原创 2022-05-12 20:26:16 · 209 阅读 · 0 评论