關係型數據庫是如何運做的(下)

此前,CSDN發佈了《關係型數據庫是如何運做的(上)》深受開發者朋友們的歡迎,本文是完結篇,內容涉及數據庫整體架構,客戶端管理器,查詢管理器,數據管理器介紹等。算法

圖片描述

整體架構數據庫

前述文章從比較細的角度來討論了數據庫,如今咱們嘗試從宏觀角度來分析。數組

數據庫的核心組件:緩存

  • 過程管理器(The process manager):數據庫都會有一個過程池/線程池須要進行管理。此外,爲了使運行時間更短,現代數據庫會使用本身的線程來替代操做系統線程。安全

  • 網絡管理器(The network manager):網絡的輸入輸出是個大問題,特別是對於分佈式數據庫來講。因此部分數據庫針對網絡管理打造了本身的管理器。服務器

  • 文件系統管理器(File system manager):磁碟I/O是數據庫的第一瓶頸。使用管理器進行磁碟文件進行管理是很重要的。網絡

  • 內存管理器(Memory manager):當你須要處理大量內存數據或大量查詢,一個高效的內存管理器是必須的。架構

  • 安全管理器(Security manager):進行認證和用戶認證管理。併發

  • 客戶端管理器(Client manager):進行客戶端鏈接管理分佈式

數據庫的工具:

備份管理器:進行數據庫的備份與恢復 
復原管理器:在數據庫崩潰後進行數據庫重啓 
監視管理器:進行數據庫活動日誌記錄,同時進行數據庫監視 
管理員管理器:進行metadata存儲,管理數據庫,表空間,數據泵等 
查詢管理器:對查詢進行有效性檢驗,優化,編譯和執行 
數據管理器:包括事務管理器,緩存管理器,數據訪問管理器

下面將詳細介紹客戶端管理器,查詢管理器以及數據管理器。

客戶端管理器

圖片描述

客戶端管理器用於處理和管理客戶端的通訊。客戶端能夠是一臺服務器或是終端應用。客戶端管理器透過不一樣的API來提供訪問權,例如:JDBC,ODBC,OLE-DB等。

當你鏈接到一個數據庫時:

  • 管理器會對你的身份和受權進行確認。
  • 若是驗證經過,會對你的查詢請求進行處理。
  • 管理器同時會檢查數據庫是否處於滿負荷狀態。
  • 管理器會等待請求資源的返回。若是發生超時,它會關閉鏈接並返回可讀的錯誤信息。
  • 而後會把你的查詢發送給查詢管理器,而你的查詢是被處理狀態。
  • 管理器會存儲部分結果到緩衝區而後開始進行結果返回。
  • 若是出現異常,管理器會中斷鏈接,返回相關緣由解釋並釋放資源。

查詢管理器

查詢管理器是數據庫的重要組成部分。其工做過程是:

  • 查詢會被解釋以確認有效性
  • 而後會被重寫以消除沒必要要的操做並進行預優化處理
  • 而後會被優化處理以提升性能併發送到執行和數據訪問計劃
  • 而後改計劃會被編譯處理
  • 最後進行執行查詢

圖片描述

查詢重寫器的運做

重寫器的目的是:

  1. 進行查詢預優化處理
  2. 避免沒必要要的操做
  3. 幫助優化器找出最佳方案

常見的重寫規則:

視圖合併:若是你在查詢中使用了視圖,那麼該視圖會被轉換層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中:

  • 首先考慮數據的K次最近使用記錄;根據數據的使用次數分配權值;若是有新的數組載入緩存,舊的但常用的數據不會被移除,可是當舊數據再也不使用,將會被移除,因此權值的設立有助於減小多餘數據。

事務管理器

事務管理器是爲了確保每一個查詢會執行本身的事務。在講述事務管理期前,咱們須要理解ACID事務的概念。

ACID是一個工做單元,它的意思是:

Atomicity(原子性):事務是」全或全不」的,即便是10個小時的事務。若是事務崩潰了,會發生狀態回滾。

Isolation(隔離性):若是事務A和B同時運行,那麼事務A和B的結果必須是一致的,不論A對於B是完成前/完成後/過程當中的狀態。

Durability(耐久性):一旦事務完成,數據會存放在數據庫中而不論發生什麼狀況(異常或錯誤)。

Consistency(一致性):只有有效數據被寫入數據庫。一致性與原子行和隔離性關聯。

併發控制

確保隔離性,附着性和原子性的關鍵是能對同一數據進行正確寫操做(添加,更新和刪除):

若是僅僅是數據讀取事務,那麼它們能夠不與其它修改事務發生衝突; 
若是一個修改事務處理的數據被其它事務讀取,數據庫須要找到方法來隱藏這些修改操做。同時,它須要保證這些修改操做不會被清除。

以上問題就是併發控制。最簡單的處理方法是逐個執行事務。可是這不利於進行規模擴張,也沒法發揮服務器/CPU的多核性能。理想的處理方式是每當事務新建或取消時:

監視全部事務的所有操做,檢查同時讀取/修改相同數據的兩個(或多個)事務是否發生衝突 
,在發生衝突的事務中進行操做記錄以減小衝突部分的大小,把衝突部分以其它次序進行處理,判別某事務是否能夠取消

更正規的作法是進行衝突日程表管理。可是在企業級數據庫中,是很難爲每一個新事務事件分配足夠多的處理時間。因此會使用其它方法來進行處理。

鎖管理器

爲了處理以上問題,多數數據庫會採用鎖或數據版原本進行處理。但這是個內容豐富的話題,如下會把討論重點放在鎖部分。

什麼是鎖呢?

  • 事務是否須要數據
  • 是否鎖定了數據
  • 另外一事務是否須要相同數據
  • 是否不得不等待直至第一個事務釋放這些數據

這叫作排斥鎖。可是排斥鎖針對的對象相同數據的讀取和等待,這是不利於資源調配的。還有一種鎖,叫共享鎖。

在共享鎖中:

  • 一個事務是否只需讀取數據A
  • 共享鎖對數據鎖定並讀取數據
  • 若是第二個事務也只須要讀取數據A
  • 共享鎖對數據鎖定並讀取數據
  • 若是第三個事務只須要修改數據A
  • 那麼會對數據進行排斥鎖鎖定,但它必須等待直至事務一,二釋放共享鎖纔對數據A進行排斥鎖鎖定

圖片描述

鎖管理器的做用是提供和釋放鎖。從內部角度看,它把鎖存儲在一個有關聯的hash數據表中。

  • 哪些事務鎖定了數據
  • 哪些事務在等待數據

死鎖

鎖的存在會致使一個問題:兩個事務在無限期地等待數據:

圖片描述

在上圖中:

  • 事務A對數據1使用了排斥鎖,同時在等待獲取數據2
  • 事務B對數據2使用了排斥是,同時在等待獲取數據1

這就是死鎖。

遇到死鎖後,鎖管理器會選擇對哪一個事務進行撤銷(回滾)以消除死鎖。但要進行選擇,並非件容易的事。DB2和SQL Sever使用了兩段鎖協議(Two-Phase Locking Protocol)來進行處理。

  • 在增加段,事務會獲得鎖,可是不能釋放鎖。
  • 在降低段,事務可釋放鎖,可是不能獲得鎖。

圖片描述

其核心理念是:

  • 釋放再也不使用的鎖以減小其餘事務對這些鎖的等待時間
  • 避免事務開始後對數據進行修改,因此這是非連貫事務

寫在最後

我一直所堅持的習慣是:明白你所使用的技術,若是你想不斷提高本身的開發水平,嘗試深刻掌握你所使用的工具的原理是個大有裨益的方法。雖然NoSQL在現今很流行,可是它們仍是屬於發展初期,一些特定的問題或重要思想仍是得藉助關係數據庫才能完全弄懂。

 

轉載:http://geek.csdn.net/news/detail/55149

相關文章
相關標籤/搜索