80

在过去的几年里,我一直在使用数据库,我想我已经相当有能力使用它们了。然而,我最近阅读了乔尔的泄漏抽象定律,我意识到即使我可以编写一个查询来从数据库中获取几乎任何我想要的东西,但我不知道数据库实际上是如何解释查询的。有谁知道任何解释数据库内部工作原理的好文章或书籍?

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

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

5 回答 5

85

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

坦率地说,这是一个蛮力的问题。简单地说,它会读取数据库中的每个候选记录并将表达式与字段匹配。所以,如果你有“select * from table where name = 'fred'”,它实际上会遍历每条记录,获取“name”字段,并将其与“fred”进行比较。

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

这减少了将表达式应用到的候选记录的数量,否则它只会执行我们所说的“表扫描”,即读取每一行。

但从根本上说,它定位候选记录的方式与应用实际过滤器表达式的方式是分开的,显然,可以进行一些巧妙的优化。

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

好吧,连接用于创建一个新的“伪表”,在其上应用过滤器。因此,您有过滤条件和连接条件。连接条件用于构建此“伪表”,然后对其应用过滤器。现在,在解释连接时,这又是与过滤器相同的问题——蛮力比较和索引读取以构建“伪表”的子集。

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

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

索引是如何存储的?

B+Trees 通常,你应该查一下。这是一种已经存在多年的直接技术。它的好处与大多数平衡树共享:对节点的一致访问,加上所有叶节点都是链接的,因此您可以轻松地按键顺序从一个节点遍历到另一个节点。因此,使用索引,可以将行视为针对数据库中的特定字段“排序”,并且数据库可以利用该信息来优化它。这与使用哈希表作为索引不同,后者只能让您快速获取特定记录。在 B-Tree 中,您不仅可以快速获取特定记录,还可以快速获取排序列表中的某个点。

在数据库中存储和索引行的实际机制非常简单易懂。游戏正在管理缓冲区,并将 SQL 转换为有效的查询路径,以利用这些基本的存储习惯。

然后,在存储惯用语之上还有整个多用户、锁定、日志记录和事务复杂性。

于 2008-10-06T01:40:23.973 回答
4
  • 数据库实际上做了什么来找出与 select 语句匹配的内容?

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

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

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

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

  • 索引是如何存储的?

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

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

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

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

于 2008-10-06T00:53:26.860 回答
1

除了阅读之外,使用 DB 工具检查数据库在查询中使用的执行计划也很有指导意义。除了深入了解它的工作原理之外,您还可以尝试使用更好的反馈循环来优化查询的技术。

于 2008-10-06T02:17:23.977 回答
0

赛义夫,很好的链接。涵盖大多数主题的鸟瞰概览,并提供有关特定供应商实施的详细信息。

我尝试写了三次解释,但这确实是一个太大的话题。查看 Hellerstein 文章(Saif 链接到的伯克利服务器上的文章),然后询问具体情况。

值得注意的是,在任何给定的 DBMS 中都只实现了“已知的好想法”的一个子集。例如,SQLite 甚至不做散列连接,它只做嵌套循环(ack!!)。但是,它是一个易于嵌入的 dbms,并且它的工作非常好,所以对于缺乏复杂性有一些话要说。

了解 DBMS 如何收集统计信息以及它如何使用它们来构建查询计划,以及首先学习如何阅读查询计划,是一项非常宝贵的技能——如果您必须选择一个“数据库内部”主题来学习,学习这个。它将带来不同的世界(并且您将永远不会再次意外地编写笛卡尔积...... ;-))。

于 2008-10-06T01:23:25.460 回答
0

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

于 2008-10-06T02:26:59.870 回答