数据库如何在内部工作?

在过去的几年里,我一直在使用数据库,我认为我已经相当有能力使用它们了。然而,我最近读到乔尔的 泄漏抽象定律,我意识到,即使我可以写一个查询得到几乎任何我想从数据库,我不知道数据库实际上如何解释查询。有人知道任何解释数据库内部如何工作的好文章或书籍吗?

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

  • 数据库实际上如何查找匹配 select 语句的内容?
  • 数据库如何用不同的“ where key1 = key2”语句对连接进行不同的解释?
  • 数据库如何存储所有内存?
  • 索引是如何存储的?
34559 次浏览
  • 数据库实际上如何查找匹配 select 语句的内容?

    DBs 使用索引(见下文)

  • 数据库如何用不同的“ where key1 = key2”语句对连接进行不同的解释? 联接操作可以通过合并树转换为二叉树操作。

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

    内存映射文件 ,以便更快地访问它们的数据

  • 索引是如何存储的?

    内部 DBs 使用 B 树进行索引。

这应该在维基百科上有更详细的解释。

Http://en.wikipedia.org/wiki/b-tree

Http://en.wikipedia.org/wiki/database

赛义夫,好链接。一个能够涵盖大多数主题并提供特定供应商实现细节的鸟瞰图。

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

It's worth noting that only a subset of "known good ideas" is implemented in any given DBMS. For example, SQLite doesn't even do hash joins, it only does nested loops (ack!!). But then, it's an easily embeddable dbms, and it does its work very well, so there's something to be said for the lack of complexity.

学习 DBMS 如何收集统计数据以及如何使用它们来构建查询计划,以及首先学习如何阅读查询计划,是一项非常宝贵的技能——如果您必须选择一个“数据库内部”主题来学习,那么请学习以下内容。它将使世界变得不同(你再也不会无意中写出笛卡儿积了... ...)。

数据库实际上对 找出匹配的选择 声明?

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

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

这减少了要应用表达式的候选记录的数量,否则它只会执行我们称之为“表扫描”的操作,即读取每一行。

但是从根本上说,无论它如何定位候选记录,都与它如何应用实际的筛选表达式是分开的,而且显然,还可以进行一些聪明的优化。

数据库如何解释联接 与具有多个 “ where key1 = key2”语句?

联接用于创建一个新的“伪表”,过滤器将应用于该表。这样,就有了筛选条件和连接条件。连接条件用于构建这个“伪表”,然后对其应用筛选器。现在,在解释连接时,这又是与过滤器相同的问题——通过强制比较和索引读取来构建“伪表”的子集。

数据库如何存储它的全部内容 记忆?

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

索引是如何存储的?

通常是 B + T 树,你应该查一下。这种直截了当的技术已经存在很多年了。它的好处与大多数平衡树共享: 对节点的一致访问,加上所有叶子节点都链接起来,因此您可以按键顺序轻松地从一个节点遍历到另一个节点。因此,对于索引,可以考虑对数据库中特定字段的行进行“排序”,数据库可以利用这些信息进行优化。这不同于为索引使用散列表,后者只允许您快速访问特定的记录。在 B-Tree 中,您不仅可以快速访问特定的记录,还可以访问已排序列表中的某个点。

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

然后,还有整个多用户、锁定、日志和事务复杂性。

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

如果您想了解更多细节,我建议您获取 sqlite 源,并查看它是如何做到这一点的。它是完整的,虽然不是在规模较大的开源和商业数据库。如果你想知道更多的细节,我推荐 SQLite 通用指南,它不仅是一个很好的解释 sqlite,但也是我知道的最可读的技术书籍之一。在 MySQL 方面,您可以从 MySQL 性能博客以及书前的 O’Reilly 高性能 MySQL(V2)中学习,博客是这本书的作者之一。