数据库如何在内部工作?

过去几年来我一直在使用数据库,我想我认为我已经很熟练地使用它们了。 不过,我最近阅读的是关于Joel的泄漏抽象定律,我意识到尽pipe我可以编写一个查询来获取我想从数据库中得到的任何东西,但我不知道数据库是如何解释查询的。 有没有人知道任何好的文章或书籍,解释数据库如何在内部工作?

我感兴趣的一些具体的事情是:

  • 数据库实际上做了什么来找出与select语句匹配的内容?
  • 一个数据库如何将一个连接解释为一个带有多个“where key1 = key2”语句的查询?
  • 数据库如何存储所有内存?
  • 索引如何存储?

数据库实际上做了什么来找出与select语句匹配的内容?

直言不讳,这是一个蛮横的问题。 简单地说,它读取数据库中的每个候选logging,并将expression式与字段进行匹配。 所以,如果你有“select * from table where name ='fred'”,它会逐字地遍历每条logging,抓取“name”字段,并将其与'fred'进行比较。

现在,如果“table.name”字段被索引,那么数据库将(可能,但不一定)首先使用索引来定位候选logging以应用实际的filter。

这减less了将expression式应用到候选logging的数量,否则它只会做我们所说的“表扫描”,即读取每一行。

但是从根本上说,它所在的候选logging与应用实际的过滤expression式是分开的,显然,有一些聪明的优化可以完成。

一个数据库如何将一个连接解释为一个带有多个“where key1 = key2”语句的查询?

那么,一个连接是用来做一个新的“伪表”,在其上应用了filter。 所以,你有过滤标准和连接标准。 连接标准用于构build这个“伪表”,然后filter应用于此。 现在,在解释连接时,与filter相同的问题 – powershell比较和索引读取来构build“伪表”的子集。

数据库如何存储所有内存?

良好数据库的关键之一是如何pipe理其I / O缓冲区。 但它基本上匹配RAM块到磁盘块。 使用现代虚拟内存pipe理器,简单的数据库几乎可以依靠虚拟机作为内存缓冲区pipe理器。 高端数据库自己做这一切。

索引如何存储?

B +树通常,你应该查找它。 这是一个直截了当的技术已经存在多年。 与大多数任何平衡树共享的好处是:对节点的一致访问,以及所有叶节点都是链接的,因此您可以按键顺序轻松地在节点之间进行遍历。 因此,通过索引,可以将行视为数据库中特定字段的“sorting”,并且数据库可以利用该信息对优化进行优化。 这与使用散列表的索引截然不同,它只能让你快速得到特定的logging。 在B-Tree中,您可以快速获取特定logging,但可以快速获取sorting列表中的某个点。

在数据库中存储和索引行的实际机制非常直截了当,并且很好理解。 游戏正在pipe理缓冲区,并将SQL转换为高效的查询path来利用这些基本的存储习惯用法。

然后,在存储方面,有多用户,locking,日志logging和事务复杂性。

  • 数据库实际上做了什么来找出与select语句匹配的内容?

    数据库正在使用索引(见下文)

  • 一个数据库如何将一个连接解释为一个带有多个“where key1 = key2”语句的查询? 连接操作可以通过合并树来转换为二叉树操作。

  • 数据库如何存储所有内存?

    内存映射文件以更快地访问其数据

  • 索引如何存储?

    内部数据库正在使用B-Trees进行索引。

这应该在维基百科更详细的解释..

http://en.wikipedia.org/wiki/B-tree

http://en.wikipedia.org/wiki/Database

除了阅读之外,使用数据库工具检查数据库在查询中使用的执行计划可能是有益的。 除了深入了解其工作原理之外,还可以尝试使用更好的反馈循环来优化查询的技术。

赛义夫,优秀的链接。 概述,涵盖大多数主题,并提供具体的供应商实施细节。

我做了三次尝试来写一个解释,但是这个话题真的太大了。 查看Hellerstein的文章(Saif链接到的berkeley服务器上的文章),然后询问具体细节。

值得注意的是,在任何给定的数据库pipe理系统中,只有一部分“已知的好主意”被实现。 例如,SQLite甚至不做散列连接,它只是嵌套循环(ack !!)。 但是,这是一个易于embedded的dbms,而且它的工作非常好,所以有些东西可以说是缺乏复杂性。

了解DBMS如何收集统计信息,以及如何使用它们来构build查询计划,以及如何首先阅读查询计划,这是一项非常宝贵的技能 – 如果您必须select一个“数据库内部”主题学习,学习这一点。 它会造成一个不同的世界(你永远不会意外地写一个笛卡尔产品… ;-))。

如果你想知道更多的细节,我build议获取sqlite资源,并看看它是如何做到的。 它是完整的,尽pipe不在更大的开源和商业数据库的规模。 如果你想更详细地了解,我推荐SQLite权威指南,这不仅是对sqlite的一个很好的解释,也是我所知道的最具可读性的技术书籍之一。 在MySQL方面,您可以从MySQL性能博客以及本书的前面学习O'Reilly 高性能MySQL (V2),博客是其中的作者之一。