主記憶體資料庫系統設計/DBMS概述
第 2 章:資料庫管理系統簡介
資料庫管理系統 (DBMS) 是處理資料儲存和檢索的軟體。如今大多數 DBMS 都是關係型 DBMS。本書只關注關係型資料庫管理系統。RDBMS 有五個主要元件
- 介面驅動程式
- SQL 引擎
- 事務引擎
- 關係引擎
- 儲存引擎
圖 1 包含 DBMS 元件、記憶體佈局和與關係型資料庫管理系統相關的磁碟檔案。從資料庫系統發展初期,磁碟被認為是資料的持久儲存,以實現永續性。上述架構適用於磁碟駐留資料庫系統 (DRDB)。如今,除了 DRDB 之外,還有兩種不同的方法。它們是
- 主記憶體資料庫 (MMDB) – 資料儲存在主記憶體中。
- 網路資料庫 – 資料儲存在網路上的另一臺主機上。
上述 DRDB 系統架構中的大多陣列件也存在於主記憶體和網路資料庫中。
使用者或應用程式程式應啟動模式修改或內容修改。這些應用程式請求被 SQL 廣泛分類為資料定義語言 (DDL)、資料操作語言 (DML) 和資料控制語言 (DCL)。DDL 處理模式修改;DML 處理內容修改;DCL 處理使用者訪問和許可權修改。如果應用程式程式是用 C/C++ 編寫的,它應使用 ODBC 驅動程式連線到 DBMS,或者如果它是用 Java 編寫的,它應使用 JDBC 驅動程式連線到 DBMS。一些供應商提供特定於語言的專有介面。例如,MySQL 為 PHP、Python 等提供驅動程式。
這些驅動程式建立在 SQL 之上。它們提供用於準備語句、執行語句、獲取結果等的方法。
此元件負責解釋和執行 SQL 查詢。它包含三個主要元件
編譯器 – 從 SQL 語句構建資料結構,然後對查詢進行語義檢查,例如表是否存在、欄位是否存在等。
最佳化器 – 將編譯器建立的初始查詢計劃(資料結構)轉換為通常管道化的操作序列,以實現快速執行。它引用有關資料的元資料(字典)和統計資訊,以確定哪些操作序列可能更快,並據此建立最佳查詢計劃。在 DRDB 的情況下,使用成本和規則兩種最佳化器。
執行引擎 – 執行最佳化器選擇的查詢計劃中的每個步驟。它與關係引擎互動以檢索和儲存記錄。
事務是讀取或寫入資料庫元素的操作序列,這些操作被分組在一起。事務應具有以下 ACID 屬性
原子性:在事務完成之後,只有所有效果或根本沒有效果應該出現在資料庫中。
一致性:約束應始終使資料庫處於一致狀態
隔離性:事務應像沒有其他事務正在執行一樣執行。
永續性:事務完成之後,事務對資料庫的影響絕不應丟失。
所有上述屬性都在事務章節中詳細解釋。
事務引擎包含三個主要元件
併發管理器 – 負責對資料的併發同步訪問。這通常使用閂鎖和鎖來實現。閂鎖或互斥鎖用於短期同步,而鎖用於長時間同步。
日誌管理器 – 負責事務的原子性和永續性屬性。撤消日誌確保事務回滾將資料庫狀態恢復到事務開始之前的先前一致狀態。重做日誌確保在發生崩潰時恢復所有已提交的事務。
恢復管理器 – 負責從磁碟映像和重做日誌檔案恢復資料庫。大多數資料庫使用一種稱為“影子分頁”的技術來維護記憶體中磁碟的一致映像。
此元件實現了諸如表、索引和引用完整性約束之類的關係物件。一些主要元件是
欄位 – 抽象出列級資訊,包括型別、長度等。目錄 – 維護有關關係資料庫物件(如表、索引、觸發器、欄位等)的元資料資訊。
表 – 負責插入、更新、刪除、獲取、執行。它與儲存引擎的分配器子系統互動,分配器子系統又與緩衝區管理器互動來完成工作。
索引 – 負責所有索引型別的索引節點的插入、更新、刪除和掃描。流行的索引型別有雜湊和樹。雜湊索引用於提高點查詢(使用主鍵上的等式作為謂詞),而樹索引用於提高範圍查詢(使用鍵上的大於或小於運算子作為謂詞)。
表示式引擎 – 表示資料檢索操作的謂詞(SQL 語句的 WHERE 子句),並負責計算表示式,這些表示式應包括算術、比較和邏輯表示式。
此元件負責儲存和檢索資料記錄。它還提供用於儲存元資料資訊和控制資訊的機制,例如撤消日誌、重做日誌、鎖定表等。重要的儲存引擎元件是
緩衝區管理器 – 負責將頁面從磁碟載入到記憶體,並根據最近最少使用 (LRU) 演算法管理緩衝區池。它還具有用於儲存控制資訊的專用分配器,這些資訊是臨時的。緩衝區池是緩衝區管理器用於快取與記錄、索引資訊、元資料資訊相關的磁碟頁面的記憶體空間。一些資料庫系統在單個級別上有限制,而另一些資料庫系統在全域性級別上限制緩衝區池的大小。
檔案管理器 – DRDB 中的資料庫不過是在磁碟上的一個物理檔案。檔案管理器將檔案的磁碟頁面對映到記憶體頁面,並在緩衝區管理器模組生成的重大故障情況下執行實際的磁碟 I/O 操作。
程序管理器 – 負責註冊和登出資料庫應用程式程序和執行緒,並記錄它們獲取的所有資源(事務、鎖、閂鎖)。
這是使用者發出 SELECT SQL 語句時概念上發生的事情,圖 2:SQL SELECT 執行順序
- 使用者發出事務開始請求 (startTrans())
- DBMS 為已啟動的事務保留一個空閒插槽 (allocSlot())
- DBMS 返回給使用者。
- 使用者發出 SELECT SQL 請求 (stmtExecute())
- DBMS 解釋請求並將其表示為資料結構 (parse())
- DBMS 檢查資料庫中是否存在表名和欄位名 (check())
- DBMS 確定執行語句的最佳方式 (optimize())
- DBMS 透過與關係引擎互動來執行語句 (execute())
- DBMS 檢查緩衝區管理器,以確定包含資料的磁碟頁面是否已存在於記憶體中 (isPageInMemory())
- 如果頁面尚未載入,DBMS 與檔案管理器互動以將頁面載入到記憶體緩衝區 (loadPage())
- DBMS 評估滿足謂詞的記錄 (evaluate())
- DBMS 根據事務的隔離級別對記錄加鎖 (lockRecord())
- DBMS 檢索記錄並返回給應用程式 (returnRecords)
- 使用者發出事務提交 (commit())
- DBMS 釋放事務期間獲得的所有鎖 (releaseLocks())
- DBMS 釋放為該事務分配的事務槽 (freeSlot())
- DBMS 返回應用程式
當用戶發出 INSERT SQL 語句時,概念上會發生以下情況:
圖 3:SQL INSERT 執行順序
- 使用者發出事務開始請求 (startTrans())
- DBMS 為已啟動的事務保留一個空閒插槽 (allocSlot())
- DBMS 返回給使用者。
- 使用者發出 INSERT SQL 請求 (stmtExecute())
- DBMS 解釋請求並將其表示為資料結構 (parse())
- DBMS 檢查資料庫中是否存在表名和欄位名 (check())
- DBMS 確定執行語句的最佳方式 (optimize())
- DBMS 透過與關係引擎互動來執行語句 (execute())
- DBMS 檢查緩衝區管理器,以確定需要分配記錄的磁碟頁面是否已存在於記憶體中 (isPageInMemory())
- 如果頁面尚未載入,DBMS 會與檔案管理器互動以將頁面載入到記憶體緩衝區 (loadPage()),以上圖中未顯示。
- DBMS 為新插入的記錄建立撤消日誌記錄 (createUndoLog())
- DBMS 將應用程式緩衝區中的值複製到分配的新記錄 (copyValues())
- DBMS 為新插入的記錄建立重做日誌記錄 (createRedoLog())
- DBMS 根據事務的隔離級別對分配的記錄加鎖 (lockRecord())
- DBMS 檢查索引是否可用,如果可用,則對該表的所有索引進行索引節點插入 (insertIndexNode())
- DBMS 檢查緩衝區管理器,以確定需要分配索引節點的索引磁碟頁面是否已存在於記憶體中 (isPageInMemory())
- 如果頁面尚未載入,DBMS 會與檔案管理器互動以將頁面載入到記憶體緩衝區 (loadPage()),以上圖中未顯示。
- DBMS 對分配的索引節點加鎖 (lockIndexNode())
- DBMS 返回應用程式,並提供受影響的行數 (returnRowsAffected)
- 使用者發出事務提交 (commit())
- DBMS 釋放事務期間獲得的所有鎖 (releaseLocks())
- DBMS 釋放為該事務分配的事務槽 (freeSlot())
- DBMS 返回應用程式


