在过去的几年里,我一直在使用数据库,我想我已经相当熟练地使用它们了。然而,我最近读到了Joel的 Law of Leaky Abstractions,我意识到即使我可以编写一个查询来从数据库中获得几乎任何我想要的东西,我也不知道数据库实际上是如何解释查询的。有没有人知道有什么好的文章或书来解释数据库内部是如何工作的?
我感兴趣的一些具体事情是:
如何存储索引?
发布于 2008-10-06 01:40:24
数据库实际执行什么操作来查找与select语句匹配的内容?
坦率地说,这是一个暴力的问题。简单地说,它读取数据库中的每个候选记录,并将表达式与字段进行匹配。因此,如果您有"select * from table where name = 'fred'",它会逐一遍历每条记录,获取"name“字段,并将其与”fred“进行比较。
现在,如果对"table.name“字段进行了索引,那么数据库将(可能,但不一定)首先使用索引来定位要应用实际过滤器的候选记录。
这减少了要应用表达式的候选记录的数量,否则它只会执行我们所说的“表扫描”,即读取每一行。
但从根本上说,它如何定位候选记录与它如何应用实际的过滤器表达式是分开的,显然,可以进行一些聪明的优化。
数据库如何以不同的方式解释带有几个"where key1 = key2“语句的查询的连接?
连接被用来创建一个新的“伪表”,在这个“伪表”上应用过滤器。这样,您就有了筛选条件和联接条件。连接条件用于构建这个“伪表”,然后对其应用筛选器。现在,在解释连接时,这又是与过滤器相同的问题--暴力比较和索引读取为“伪表”构建子集。
数据库如何存储其所有内存?
好的数据库的关键之一是它如何管理它的I/O缓冲区。但它基本上将RAM块与磁盘块进行匹配。使用现代虚拟内存管理器,更简单的数据库几乎可以依赖VM作为其内存缓冲区管理器。高端数据库自己完成了所有这些工作。
索引是如何存储的?
B+Trees通常情况下,您应该查找它。这是一种已经存在多年的简单技术。它的好处几乎与任何平衡树共享:对节点的一致访问,加上所有叶节点都被链接在一起,因此您可以按键顺序轻松地从一个节点遍历到另一个节点。因此,通过索引,可以将数据库中特定字段的行视为“排序”,数据库可以利用该信息对其进行优化。这与使用哈希表作为索引是不同的,哈希表只能让您快速找到特定的记录。在B-Tree中,您不仅可以快速访问特定的记录,还可以访问排序列表中的某一点。
在数据库中存储和索引行的实际机制非常简单易懂。游戏是管理缓冲区,并将SQL转换为有效的查询路径,以利用这些基本的存储习惯。
然后,在存储习惯用法之上还有整个多用户、锁定、日志记录和事务的复杂性。
发布于 2008-10-06 00:53:27
DB正在使用索引(见下文)
内存映射文件用于更快地访问其数据
在内部,DB使用B-Trees进行索引。
这应该在维基百科上更详细地解释。
http://en.wikipedia.org/wiki/B-tree
http://en.wikipedia.org/wiki/Database
发布于 2008-10-06 02:17:24
除了阅读之外,使用DB工具检查数据库在查询中使用的执行计划也很有指导意义。除了深入了解它是如何工作的之外,您还可以尝试使用一些技术来通过更好的反馈循环来优化查询。
https://stackoverflow.com/questions/172925
复制相似问题