如何编写简单的数据库引擎

时间:2009-06-27 05:44:52

标签: sql database theory database-engine

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

  • 如何在内部存储数据(即如何表示表格等)
  • 引擎如何找到所需的数据(例如,运行SELECT查询)
  • 如何以快速有效的方式插入数据

以及可能与此相关的任何其他主题。它不一定是磁盘上的数据库 - 即使是内存数据库也没问题(如果它更容易),因为我只想学习它背后的原理。

非常感谢你的帮助。

9 个答案:

答案 0 :(得分:53)

如果你擅长阅读代码,那么学习SQLite会教你一大堆关于数据库设计的知识。它很小,所以它更容易包裹你的头。但它也是专业写的。

http://sqlite.org/

答案 1 :(得分:25)

这个问题的答案很大。期望PHD论文能够100%回答;) 但我们可以逐一思考问题:

  • 如何在内部存储数据: 你应该有一个包含数据库对象和缓存机制的数据文件,以便将焦点数据和周围的一些数据加载到RAM中 假设你有一个表,有一些数据,我们会创建一个数据格式,将这个表转换成二进制文件,同意列定界符和行分隔符的定义,并确保从未使用这种分隔符模式数据本身。即如果您选择了< *>例如,要分隔列,您应该验证您在此表中放置的数据不包含此模式。您还可以通过指定行的大小和一些内部索引号来使用行标题和列标题,以加快搜索速度,并在每列的开头使用此列的长度 喜欢“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>

  • 如何快速查找商品 尝试使用散列和索引来指向基于不同标准存储和缓存的数据 以上相同的例子,您可以对第一列的值进行排序,并将其存储在一个单独的对象中,该对象指向按字母顺序排序的项目的行ID,依此类推

  • 如何加快插入数据的速度 我从Oracle了解到,他们在RAM和磁盘上的临时位置插入数据并定期进行内务管理,数据库引擎一直忙于优化其结构,但同时我们不希望丢失数据。这样的电源故障的情况。 因此,尝试将数据保存在此临时位置,不进行排序,附加原始存储,稍后系统可以自由使用索引并在完成后清除临时区域

祝你好运,伟大的项目。

答案 2 :(得分:11)

Garcia-Molina,Ullman和Widom有关于这个主题的书籍是一个很好的起点Database Systems: The Complete Book

答案 3 :(得分:10)

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

通过研究SQlite,我个人学到了很多东西。有趣的是,我没有去过源代码(虽然我只是简短地看一下)。通过阅读技术资料并特别查看它生成的内部命令,我学到了很多东西。它里面有一个自己的基于堆栈的解释器,你可以通过使用explain来读取它内部生成的P-Code。因此,您可以看到各种构造如何被转换为低级引擎(这非常简单 - 但这也是其稳定性和效率的秘密)。

答案 4 :(得分:8)

我建议关注www.sqlite.org

最近,小(源代码1MB),开源(所以你可以自己解决)......

已经写了关于如何实施的书籍:

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

它可以在台式电脑和手机的各种操作系统上运行,因此实验很容易,现在和将来都可以学习它。

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

答案 5 :(得分:8)

答案 6 :(得分:6)

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

答案 7 :(得分:3)

如果MySQL感兴趣,我也会建议wiki page,它有一些关于MySQL如何工作的信息。另外,您可能需要查看 Understanding MySQL Internals

您可能还会考虑查看数据库引擎的非SQL接口。请看Apache CouchDB。它就是你所说的,一个面向文档的数据库系统。

祝你好运!

答案 8 :(得分:2)

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