如何写一个简单的数据库引擎

我有兴趣了解数据库引擎如何工作(即它的内部)。 我知道CS(树,散列表,列表等)中教授的大部分基本数据结构以及对编译器理论的相当好的理解(并且已经实现了一个非常简单的解释器),但我不明白如何去关于编写数据库引擎。 我已经search了关于这个主题的教程,我找不到任何东西,所以我希望别人能指出我正确的方向。 基本上,我想了解以下信息:

  • 数据如何存储在内部(例如,表格是如何表示的等)
  • 引擎如何find它需要的数据(例如,运行SELECT查询)
  • 如何以快速高效的方式插入数据

和其他可能与此相关的话题。 它不一定是在磁盘上的数据库 – 即使内存数据库是好的(如果更容易),因为我只是想了解其背后的原则。

非常感谢您的帮助。

如果你擅长阅读代码,学习SQLite将教你一个关于数据库devise的完整内容。 它很小,所以你的头很容易。 但它也是专业书面的。

http://sqlite.org/

这个问题的答案是巨大的。 希望博士论文有100%的答案),但是我们可以一个一个的思考问题:

  • 如何在内部存储数据:你应该有一个数据文件包含你的数据库对象和一个caching机制来加载数据焦点和周围的一些数据到RAM假设你有一个表,有一些数据,我们会创build一个数据格式把这个表转换成一个二进制文件,同意列定界符和行定界符的定义,并确保这样的定界符模式从来没有用在你的数据本身。 也就是说,如果您已经select了<*>来分隔列,那么您应该validation您在此表中放置的数据是否包含此模式。 你也可以通过指定行的大小和一些内部索引号来使用行标题和列标题来加速你的search,并且在每一列的开始处使这个列的长度像“Adam”,1,11.1, “123 ABC Street POBox 456”你可以像<&RowHeader,1> <&Col1,CHR,4> Adam <&Col2,num 1,0> 1 <&Col3,Num,2,1> 111 <&Col4,CHR, 24> 123 ABC Street POBox 456 <&RowTrailer>

  • 如何快速查找项目尝试使用散列和索引来指向存储和caching的数据根据​​不同的标准采取上述相同的例子,您可以sorting第一列的值,并将其存储在一个单独的对象指向的行id的项目按字母顺序sorting, 等等

  • 如何加快Oracle的插入数据速度是因为他们将数据插入RAM和磁盘的临时位置,并定期进行内务pipe理,数据库引擎始终忙于优化其结构,但同时我们不希望在发生类似事件的电源故障时丢失数据。 所以尽量将数据保存在这个临时的地方,不要sorting,追加你的原始存储空间,以后系统可以自由使用索引并在完成时清除临时区域

祝你好运,伟大的项目。

关于这个话题的书籍是一个很好的起点,那就是数据库系统: Garcia-Molina,Ullman和Widom 的完整书

我build议专注于www.sqlite.org

这是最近,小(源代码1MB),开源(所以你可以自己搞清楚)…

有关书籍是如何实施的:

http://www.sqlite.org/books.html

它运行在桌面电脑和手机的各种操作系统上,因此试验很容易,现在和将来对它的了解都将非常有用。

它甚至在这里有一个体面的社区: https : //stackoverflow.com/questions/tagged/sqlite

之前提到SQLite,但我想添加一些东西。

我亲自通过学习SQlite了解了很多。 有趣的是,我没有去源代码(虽然我只是看了一下)。 我通过阅读技术资料并专门研究它产生的内部命令,学到了很多东西。 它内部有一个自己的基于栈的解释器,你可以通过使用解释来读取它在内部生成的P代码。 因此,您可以看到各种构造是如何转化为低级引擎的(这简单得令人惊讶 – 但这也是其稳定性和效率的秘诀)。

可能你可以从HSQLDB学习。 我认为他们提供了小而简单的学习数据库。 你可以看看代码,因为它是开源的。

如果MySQL感兴趣的话,我也会build议这个wiki页面 ,里面有关于MySQL如何工作的一些信息。 此外,你可能想看看理解MySQL内部

您也可以考虑查看数据库引擎的非SQL接口。 请看看Apache CouchDB 。 它将会是一个面向文档的数据库系统。

祝你好运!

我不确定它是否符合您的要求,但是我已经实现了一个简单的面向文件的数据库,支持使用perl的简单( SELECT, INSERT , UPDATE )。
我所做的是将每个表格作为一个文件存储在磁盘上,并使用定义良好的模式存储条目,并使用内置的Linux工具(如awk和sed)来操作数据。 为了提高效率,经常访问的数据被caching。