2008-10-06 107 views
67

過去幾年我一直在使用數據庫,我想我已經很熟練地使用它們了。不過,我最近在閱讀關於Joel的 Law of Leaky Abstractions,我意識到儘管我可以編寫一個查詢來獲取我想從數據庫中得到的任何東西,但我不知道數據庫如何實際解釋查詢。有沒有人知道任何好的文章或書籍可以解釋數據庫如何在內部工作?數據庫如何在內部工作?

一些具體的事情,我感興趣的是:

  • 什麼是數據庫實際上做找出匹配的select語句?
  • 數據庫如何以不同的方式將連接解釋爲具有多個「where key1 = key2」語句的查詢?
  • 數據庫如何存儲其所有內存?
  • 索引如何存儲?
+1

截至2015年,有[這篇文章](http://coding-geek.com/how-databases-work/),這似乎很不錯。 – Piovezan 2016-07-07 13:16:59

+0

試試這個http://db.cs.berkeley.edu/papers/fntdb07-architecture.pdf和WikiPedia。這是一個像RDBMS,FLATFILE等一樣巨大的話題和模型。解析器確實是最重要的組件之一。謝謝 – 2008-10-06 00:52:00

回答

65

數據庫實際上做了什麼 找出與選擇 聲明匹配的內容?

不客氣,這是一個暴力問題。簡單地說,它讀取數據庫中的每個候選記錄並將表達式與字段匹配。所以,如果你有「select * from table where name ='fred'」,它會逐字地遍歷每條記錄,抓住「name」字段,並將其與'fred'進行比較。

現在,如果「table.name」字段被索引,那麼數據庫將(可能,但不一定)首先使用索引來定位候選記錄以應用實際的過濾器。

這減少了應用表達式的候選記錄的數量,否則它只會做我們稱之爲「表掃描」,即讀取每一行。

但是,從根本上說,它定位的候選記錄與它如何應用實際的過濾表達式是分開的,顯然,有一些聰明的優化可以完成。

數據庫又如何解釋聯接 不同的查詢與幾個 「其中KEY1 = KEY2」語句?

那麼,一個連接是用來製作一個新的「僞表」,應用過濾器。所以,你有過濾標準和連接標準。連接標準用於構建這個「僞表」,然後過濾器應用於此。現在,在解釋連接時,它又是與過濾器相同的問題 - 強力比較和索引讀取來構建「僞表」的子集。

數據庫如何存儲其所有 內存?

良好的數據庫的關鍵之一是它如何管理其I/O緩衝區。但它基本上將RAM塊匹配到磁盤塊。使用現代虛擬內存管理器,簡單的數據庫幾乎可以依靠虛擬機作爲內存緩衝區管理器。高端數據庫自己完成所有這些工作。

索引如何存儲?

B +樹通常,你應該查找它。這是一種直截了當的技術,已經存在多年。與大多數任何平衡樹共享它的好處:對節點的一致訪問,以及所有葉節點的鏈接,因此您可以按鍵順序輕鬆地從節點到節點進行遍歷。因此,對於索引,可以將這些行視爲數據庫中特定字段的「排序」,並且數據庫可以利用該信息使其受益於優化。這與使用散列表的索引截然不同,它只能讓您快速獲取特定記錄。在B-Tree中,您不僅可以快速獲取特定記錄,還可以快速獲取排序列表中的某個點。

在數據庫中存儲和索引行的實際機制非常直截了當並且很好理解。遊戲正在管理緩衝區,並將SQL轉換爲高效的查詢路徑以利用這些基本存儲習慣用法。

然後,在存儲方式上,存在整個多用戶鎖定,日誌記錄和事務複雜性。

4
  • 什麼是數據庫實際上做找出匹配的select語句?

    的DB使用索引(見下文)

  • 數據庫又如何解釋一個加入不同的查詢與幾個「其中KEY1 = KEY2」語句? 通過合併樹可以將連接操作轉換爲二叉樹操作。

  • 數據庫如何存儲其所有內存?

    存儲器映射文件其數據

  • 如何更快地訪問存儲索引?

    內部數據庫正在與B-樹索引。

這應該更詳細的維基百科解釋..

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

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

0

賽義夫,優良的鏈接。鳥瞰概述,涵蓋大部分主題,並提供有關特定供應商實施的詳細信息。

我做了三次嘗試寫作解釋,但這實在太大了一個話題。查看Hellerstein的文章(Saif鏈接到的berkeley服務器上的文章),然後詢問具體細節。

值得注意的是,在任何給定的DBMS中只實現了「已知好主意」的一個子集。例如,SQLite甚至不會執行散列連接,它只會執行嵌套循環(ack !!)。但是,它是一個易於嵌入的dbms,它的工作非常好,所以有些東西可以說是缺乏複雜性。

瞭解DBMS如何收集統計數據以及如何使用它們來構建查詢計劃以及如何首先閱讀查詢計劃是一項非常寶貴的技能 - 如果您必須選擇一個「數據庫內部「主題學習,學習這一點。它會造成一個不同的世界(並且你永遠不會意外地再次寫笛卡爾產品...... ;-))。

1

除了閱讀,使用數據庫工具檢查數據庫在您的查詢中使用的執行計劃可能是有益的。除了深入瞭解其工作原理外,您還可以嘗試使用更好的反饋循環優化查詢的技術。

0

如果您想詳細瞭解更多信息,我建議您獲取sqlite源代碼並查看它是如何實現的。它是完整的,儘管不在更大的開源和商業數據庫的規模。如果您想詳細瞭解更多信息,我建議The Definitive Guide to SQLite這不僅是對sqlite的一個很好的解釋,也是我認識的最具可讀性的技術書籍之一。在MySQL方面,您可以從MySQL Performance Blog以及O'Reilly High Performance MySQL(V2)的書本上了解到博客是其中的作者。