數據庫實際上做了什麼 找出與選擇 聲明匹配的內容?
不客氣,這是一個暴力問題。簡單地說,它讀取數據庫中的每個候選記錄並將表達式與字段匹配。所以,如果你有「select * from table where name ='fred'」,它會逐字地遍歷每條記錄,抓住「name」字段,並將其與'fred'進行比較。
現在,如果「table.name」字段被索引,那麼數據庫將(可能,但不一定)首先使用索引來定位候選記錄以應用實際的過濾器。
這減少了應用表達式的候選記錄的數量,否則它只會做我們稱之爲「表掃描」,即讀取每一行。
但是,從根本上說,它定位的候選記錄與它如何應用實際的過濾表達式是分開的,顯然,有一些聰明的優化可以完成。
數據庫又如何解釋聯接 不同的查詢與幾個 「其中KEY1 = KEY2」語句?
那麼,一個連接是用來製作一個新的「僞表」,應用過濾器。所以,你有過濾標準和連接標準。連接標準用於構建這個「僞表」,然後過濾器應用於此。現在,在解釋連接時,它又是與過濾器相同的問題 - 強力比較和索引讀取來構建「僞表」的子集。
數據庫如何存儲其所有 內存?
良好的數據庫的關鍵之一是它如何管理其I/O緩衝區。但它基本上將RAM塊匹配到磁盤塊。使用現代虛擬內存管理器,簡單的數據庫幾乎可以依靠虛擬機作爲內存緩衝區管理器。高端數據庫自己完成所有這些工作。
索引如何存儲?
B +樹通常,你應該查找它。這是一種直截了當的技術,已經存在多年。與大多數任何平衡樹共享它的好處:對節點的一致訪問,以及所有葉節點的鏈接,因此您可以按鍵順序輕鬆地從節點到節點進行遍歷。因此,對於索引,可以將這些行視爲數據庫中特定字段的「排序」,並且數據庫可以利用該信息使其受益於優化。這與使用散列表的索引截然不同,它只能讓您快速獲取特定記錄。在B-Tree中,您不僅可以快速獲取特定記錄,還可以快速獲取排序列表中的某個點。
在數據庫中存儲和索引行的實際機制非常直截了當並且很好理解。遊戲正在管理緩衝區,並將SQL轉換爲高效的查詢路徑以利用這些基本存儲習慣用法。
然後,在存儲方式上,存在整個多用戶鎖定,日誌記錄和事務複雜性。
截至2015年,有[這篇文章](http://coding-geek.com/how-databases-work/),這似乎很不錯。 – Piovezan 2016-07-07 13:16:59
試試這個http://db.cs.berkeley.edu/papers/fntdb07-architecture.pdf和WikiPedia。這是一個像RDBMS,FLATFILE等一樣巨大的話題和模型。解析器確實是最重要的組件之一。謝謝 – 2008-10-06 00:52:00