我感兴趣的学习数据库引擎是如何工作的(即它的内部)。 我知道大多数在CS传授基本的数据结构(树,哈希表,列表等),以及编译原理的一个很好的理解(和实现了一个非常简单的解释),但我不知道如何去有关编写数据库引擎。 我搜索了关于这个问题的教程和我找不到任何,所以我希望有人可以点我在正确的方向。 基本上,我想以下信息:
- 数据如何在内部存储(即表是如何表示的,等等)
- 发动机如何找到它需要的数据(例如运行SELECT查询)
- 数据是如何插入的方式,快速,高效
和任何其他的话题可能是有关这一点。 它没有成为一个磁盘上的数据库 - 甚至是内存数据库是罚款(如果是比较容易),因为我只是想学的校长后面。
非常感谢您的帮助。
如果你擅长阅读代码,学习SQLite的将教你有关数据库设计的整体一大堆。 它体积小,所以它更容易绕到你的头。 但它也是专业笔试。
http://sqlite.org/
在回答这个问题是一个巨大的一个。 期待一个博士论文有它回答100%),但我们可以想一个问题之一:
如何存储数据的内部:你应该有一个数据文件,其中包含数据库对象和高速缓存机制,围绕它加载焦点的数据和一些数据到RAM假设你有一个表,有一些数据,我们将创建一个数据格式该表转换成二进制文件,通过商定一个列分隔符的定义和行分隔符,并分隔符确保这种模式永远不会在你的数据本身使用。 即,如果你已选择<*>例如以分离柱,你应该验证在该表中不包含这个图案放置数据。 你也可以使用一个行标题和列标题通过指定行和一些内部索引号,以加快搜索的大小,并在每一列的开始,有一个像“亚当”,1,11.1这一列的长度, “123 ABC街邮政信箱456” 你可以把它像<&的rowHeader,1> <&Col1中,CHR,4>亚当<&Col2中,NUM,1,0> 1 <&COL3,货号,2,1> 111 <&COL4,CHR, 24> 123 ABC街邮政信箱456 <&RowTrailer>
如何找到物品迅速使用散列和索引的存储和基于以上述同样的例子不同的标准缓存数据来点试试,你可以排序的第一列的值,并将其存储在一个单独的对象,在按字母顺序排序项行ID指向, 等等
如何加快插入数据我从Oracle知道的是,他们在一个临时的地方都在RAM和磁盘插入数据和做家政定期,数据库引擎是忙碌的时间来优化其结构,但同时我们不想在类似的东西断电的情况下丢失数据。 所以尽量将数据保存在这个临时的地方,没有排序,附加你的原始存储,以及后来当系统是免费的度假胜地您的索引和清除临时区域完成时
运气好,伟大工程。
上有相关的书籍,一个良好的开端将是数据库系统:全书由加西亚-莫利纳,乌尔曼和代表智慧
SQLite的是前面提到的,但我想添加一些东西。
我个人通过研究SQlite的学到了很多东西。 有趣的是,我没有去的源代码(虽然我只是很短的样子)。 我通过阅读技术资料和专门寻找它产生的内部命令学到了很多。 这里面有一个自己的基于堆栈的解释,你可以阅读的P代码,它只是通过解释内部生成。 因此,你可以看到如何构建各种被转换到低级别的发动机(也就是出奇的简单 - 但是,这也是它的稳定性和效率的秘密)。
好吧,我发现这对SQL和实现一些信息的网站 - 这是一个有点硬链接到它列出了所有的教程页面,所以我会通过一个链接逐一:
- http://c2.com/cgi/wiki?CategoryPattern
- http://c2.com/cgi/wiki?SliceResultVertically
- http://c2.com/cgi/wiki?SqlMyopia
- http://c2.com/cgi/wiki?SqlPattern
- http://c2.com/cgi/wiki?StructuredQueryLanguage
- http://c2.com/cgi/wiki?TemplateTables
- http://c2.com/cgi/wiki?ThinkSqlAsConstraintSatisfaction
我建议重点www.sqlite.org
这是最近的,小的(源代码1MB),开源(这样你就可以算出它自己)...
书已经写了它是如何实现的:
http://www.sqlite.org/books.html
它运行在桌面电脑和手机都这样的实验是容易的,了解这将是有用的,现在和将来的各种操作系统。
它甚至在这里有一个体面的社会: https://stackoverflow.com/questions/tagged/sqlite
可能是你可以借鉴HSQLDB 。 我认为,他们提供小而简单的数据库学习。 你可以看一下代码,因为它是开源的。
如果MySQL感兴趣的内容,我也建议此wiki页面 ,这已经得到了关于MySQL如何工作的一些信息。 此外,你可能想看看了解MySQL内部 。
你也可以考虑在寻找一个非SQL界面为你的数据库引擎。 请看一看Apache的CouchDB的 。 它你会叫什么,一个面向文档的数据库系统。
祝好运!
我不知道它是否会符合您的要求,但我已经实现了一个简单的面向文件的数据库,支持简单的(支持SELECT, INSERT , UPDATE
用perl)。
我所做的就是我存储在每个表在磁盘上和条目的文件有明确定义的图案,并使用内置的Linux工具如awk和sed操纵数据。 为提高效率,经常访问的数据进行缓存。