此前,CSDN發佈了《關係型數據庫是如何運做的(上)》深受開發者朋友們的歡迎,本文是完結篇,內容涉及數據庫整體架構,客戶端管理器,查詢管理器,數據管理器介紹等。算法
整體架構數據庫
前述文章從比較細的角度來討論了數據庫,如今咱們嘗試從宏觀角度來分析。數組
數據庫的核心組件:緩存
過程管理器(The process manager):數據庫都會有一個過程池/線程池須要進行管理。此外,爲了使運行時間更短,現代數據庫會使用本身的線程來替代操做系統線程。安全
網絡管理器(The network manager):網絡的輸入輸出是個大問題,特別是對於分佈式數據庫來講。因此部分數據庫針對網絡管理打造了本身的管理器。服務器
文件系統管理器(File system manager):磁碟I/O是數據庫的第一瓶頸。使用管理器進行磁碟文件進行管理是很重要的。網絡
內存管理器(Memory manager):當你須要處理大量內存數據或大量查詢,一個高效的內存管理器是必須的。架構
安全管理器(Security manager):進行認證和用戶認證管理。併發
客戶端管理器(Client manager):進行客戶端鏈接管理分佈式
數據庫的工具:
備份管理器:進行數據庫的備份與恢復
復原管理器:在數據庫崩潰後進行數據庫重啓
監視管理器:進行數據庫活動日誌記錄,同時進行數據庫監視
管理員管理器:進行metadata存儲,管理數據庫,表空間,數據泵等
查詢管理器:對查詢進行有效性檢驗,優化,編譯和執行
數據管理器:包括事務管理器,緩存管理器,數據訪問管理器
下面將詳細介紹客戶端管理器,查詢管理器以及數據管理器。
客戶端管理器
客戶端管理器用於處理和管理客戶端的通訊。客戶端能夠是一臺服務器或是終端應用。客戶端管理器透過不一樣的API來提供訪問權,例如:JDBC,ODBC,OLE-DB等。
當你鏈接到一個數據庫時:
查詢管理器
查詢管理器是數據庫的重要組成部分。其工做過程是:
查詢重寫器的運做
重寫器的目的是:
常見的重寫規則:
視圖合併:若是你在查詢中使用了視圖,那麼該視圖會被轉換層SQL視圖代碼
子查詢扁平化:子查詢使查詢優化變得困難,所以重寫器會修改含有子查詢的查詢以消除子查詢。
例如:
會被重寫爲:
消除沒必要要的操做符:例如當你使用了UNIQUE惟一約束而同時使用了DISTINCT操做符,那麼DISTINCT將會被消除。
多於JOIN鏈接清除:當你 有兩次相同條件的JOIN鏈接可是其中一個條件被隱藏了或者是一個多於的JOIN,那麼它會被清除。
分區處理:若是你使用了一個分區表,那麼重寫器會找出那個分區會被使用。
自定義規則:若是你有自定義的查詢規則,重寫器會執行這些規則。
數據管理器
查詢管理器的做用是執行查詢並對資源發出請求,數據管理器會處理這些請求並返回結果。但這裏有兩個問題:
那麼關係數據庫是如何解決這兩個問題的呢?
緩存管理器
如前所述,數據庫的主要瓶頸是磁碟I/O。因此現代數據庫使用了緩存管理器來提升效率。
查詢執行器的數據請求對象是緩存管理器而不是直接的文件系統。緩存管理器有一個內存裏緩存叫作緩衝池。從內存獲取數據會大大提升數據庫速度。
緩衝–替換策略
不少主流數據庫(如:SQL Server,MySQL,Oracle等)使用的是LRU算法。
LRU是Least Recently Used的簡寫,意思最近使用。其理念是緩存最近使用的數據以便再次使用時快速讀取。
雖然它有不少優勢但也存在不足,比方說表/索引的大小超過了緩衝區大小。所以出現了進階版本的LRU,這就是LRU-K,例如在SQL Server 使用的是LRU-K,K=2。在LRU-K中:
事務管理器
事務管理器是爲了確保每一個查詢會執行本身的事務。在講述事務管理期前,咱們須要理解ACID事務的概念。
ACID是一個工做單元,它的意思是:
Atomicity(原子性):事務是」全或全不」的,即便是10個小時的事務。若是事務崩潰了,會發生狀態回滾。
Isolation(隔離性):若是事務A和B同時運行,那麼事務A和B的結果必須是一致的,不論A對於B是完成前/完成後/過程當中的狀態。
Durability(耐久性):一旦事務完成,數據會存放在數據庫中而不論發生什麼狀況(異常或錯誤)。
Consistency(一致性):只有有效數據被寫入數據庫。一致性與原子行和隔離性關聯。
併發控制
確保隔離性,附着性和原子性的關鍵是能對同一數據進行正確寫操做(添加,更新和刪除):
若是僅僅是數據讀取事務,那麼它們能夠不與其它修改事務發生衝突;
若是一個修改事務處理的數據被其它事務讀取,數據庫須要找到方法來隱藏這些修改操做。同時,它須要保證這些修改操做不會被清除。
以上問題就是併發控制。最簡單的處理方法是逐個執行事務。可是這不利於進行規模擴張,也沒法發揮服務器/CPU的多核性能。理想的處理方式是每當事務新建或取消時:
監視全部事務的所有操做,檢查同時讀取/修改相同數據的兩個(或多個)事務是否發生衝突
,在發生衝突的事務中進行操做記錄以減小衝突部分的大小,把衝突部分以其它次序進行處理,判別某事務是否能夠取消
更正規的作法是進行衝突日程表管理。可是在企業級數據庫中,是很難爲每一個新事務事件分配足夠多的處理時間。因此會使用其它方法來進行處理。
鎖管理器
爲了處理以上問題,多數數據庫會採用鎖或數據版原本進行處理。但這是個內容豐富的話題,如下會把討論重點放在鎖部分。
什麼是鎖呢?
這叫作排斥鎖。可是排斥鎖針對的對象相同數據的讀取和等待,這是不利於資源調配的。還有一種鎖,叫共享鎖。
在共享鎖中:
鎖管理器的做用是提供和釋放鎖。從內部角度看,它把鎖存儲在一個有關聯的hash數據表中。
死鎖
鎖的存在會致使一個問題:兩個事務在無限期地等待數據:
在上圖中:
這就是死鎖。
遇到死鎖後,鎖管理器會選擇對哪一個事務進行撤銷(回滾)以消除死鎖。但要進行選擇,並非件容易的事。DB2和SQL Sever使用了兩段鎖協議(Two-Phase Locking Protocol)來進行處理。
其核心理念是:
寫在最後
我一直所堅持的習慣是:明白你所使用的技術,若是你想不斷提高本身的開發水平,嘗試深刻掌握你所使用的工具的原理是個大有裨益的方法。雖然NoSQL在現今很流行,可是它們仍是屬於發展初期,一些特定的問題或重要思想仍是得藉助關係數據庫才能完全弄懂。
轉載:http://geek.csdn.net/news/detail/55149