關係型資料庫工作原理 快取記憶體 20

2021-07-10 18:41:20 字數 3055 閱讀 4833

先翻譯快取記憶體章節,後續有時間再翻譯其它章節。翻譯內容在原文的目錄:

資料查詢器執行查詢操作,從資料表中獲取資料,它向data manger傳送請求,獲取資料。其中存在2個問題:

關係型資料使用事物模型,當資料庫在執行修改操作時,不能執行查詢操作。避免查詢出髒資料。

資料提取是最慢的資料庫操作,因為資料要從磁碟上讀取。因此,資料庫必須要有乙個非常強大的資料快取系統。

本章,我們將看一下關係資料是如何解決這兩個問題的。我們不會**資料庫是如何從磁碟載入資料的,這個不是本文的重點(受篇幅所限,不展開分析)。

正如我之前所言,資料庫的效能瓶頸是i/o。為了提公升效能,現代資料庫都使用了快取記憶體。

資料查詢器從cache manger中獲取資料,而不是直接從磁碟檔案中讀取資料。cache manger管理著一片記憶體區域,叫快取池。 直接從記憶體獲取資料,使得訪問資料庫的效能突飛猛進。但是,很難評估使用快取記憶體的重要性有多大,這取決於你要做什麼樣的資料庫操作。

以及資料庫使用的是什麼樣的磁碟

但是,我敢說使用記憶體快取記憶體比不適用快取直接從磁碟讀資料快100到10萬倍。

這也導致另外乙個問題(所有的資料庫都有這個問題……), 快取記憶體器需要在查詢器訪問資料之前預取資料,否則查詢器需要掛起,等待快取記憶體器把資料從磁碟載入到記憶體先。

問題的核心就在「資料預取」。資料查詢器清楚需要哪些資料,因為它了解每一次查詢操作的具體要求,也清楚資料庫表的儲存結構。資料預取的基本邏輯是這樣的:

資料查詢器在獲取第一批資料時通知cache manger提前載入第二批資料到快取中。

資料查詢器在獲取第二批資料時通知cache manger提前載入第三批資料,而第一批資料可以從快取中移除了。

…….

cache manger儲存所有的資料在快取池中。為了確定快取池中資料是否正在被使用,cache manger需要維護一些關於這些資料的額外資訊(被稱之為鎖的東西)。

但有時,資料查詢器不清楚下一步需要什麼資料,或者資料庫沒有提供指定預取哪些資料的功能。取而代之,資料庫提供的是隨機預取功能(例如,查詢了資料1,2,3後,它因為你可能還需要7,8,9,提前把7,8,9載入到快取中)或者順序快取功能(執行一次查詢後,將磁碟上查詢資料臨近的其它資料也預取到快取中)。

為了評估cache manger預期機制工作的效果,現代資料庫系統提供乙個指標度量:快取命中率。快取命中率描述查詢器從快取中拿到資料的機率(在不需要讀磁碟檔案的情況下)。

但是,快取記憶體記憶體大小是受限的,快取內容需要不斷吐故納新。快取資料的載入和移除都需要消耗磁碟i/o和網路i/o資源。如果某個查詢操作要經常執行,快取資料頻繁的載入和移除是非常低效的。為了解決這個問題,現代資料庫都使用了一些快取置換策略。

大多數現代資料庫快取置換策略都使用lru演算法,至少sql server, mysql, oracle and db2是這樣的。

lru的意思是非最近當前使用。這個演算法的是基於這樣一種假設:最近使用過的資料,在將來被再次使用的概率很大,需要駐留在快取中;反之,非最近當前使用的資料可移除。

為了方便理解,我們假設快取中的資料未被加鎖(因此可被移除)。舉個例子說明它的工作原理,這個簡單的示例中快取池能容納3個資料。

cache manger使用資料1後,將1放入快取。

cache manger使用資料4後,將4放入快取。

cache manger使用資料3後,將3放入快取。

cache manger使用資料9後,將9放入快取。由於快取已滿,需要先移除一條資料;移除哪一條?

根據lru原則,1是最遠當前使用的資料,移除1後加入9。

cache manger使用資料4後放入快取,4變成了最近被使用過的資料。調整順序。

cache manger使用資料1後放入快取,1變成了最近被使用過的資料。3被移除。……

演算法ok,但有一些限制,如果讀取的是一張大表呢? 換言之,讀取的表資料太大,超過了快取空間的大小。使用該演算法將清除快取之前所有的資料,即使新載入上來的這張大表資料只會使用一次就不再使用。

為解決這個問題,一些資料庫管理系統加了一些特殊規則。例如:oracle規則說明:

對於超級大表的讀取,直接從磁碟檔案中讀取資料,避免是用快取記憶體。對於中型表,可以從磁碟檔案直接讀也可以用快取;如果使用快取應該把讀取的資料放到lru列表末尾(這樣,新加入快取資料時將先把該錶的資料移除)。

lru演算法有高階版本,叫lru-k。例如sql server使用的lru-k, k=2。k代表的是考慮最近時間段,資料訪問的次數。

前面的例子是lru-k演算法最簡單的例子,只考慮一次訪問,k = 1。lru-k的原理如下:

記錄資料的最近訪問次數(最多記錄k次)。

根據資料訪問次數,設定乙個權值。最近訪問次數越多的權值越大。

當一批新的資料載入到快取中時,權值大的資料不會被移除,即使該資料是很早就載入到快取中的。

如果資料長時間未被再使用,權值會逐漸降低。

權值的計算是很耗資源的,這也是為什麼 sql server使用k=2的原因。這種設定方式,投入產出比較高。

想更深入的了解lru演算法,可以參考一下演算法文件(文件google)。

還有一些其它演算法策略,用於管理快取記憶體器。

一些資料庫允許你使用除預設演算法外的其它演算法。多種方式可選。

前討論的最多的是讀快取器,它在資料使用之前將其提前載入到記憶體。資料庫中還存在一種寫快取器,它將多次操作修改的資料儲存累計起來,一次寫到磁碟檔案。降低對磁碟io的頻繁訪問(資料庫瓶頸在i/o)。

謹記,快取記憶體中儲存的是分頁資料而不是人們直觀印象中的行資料。如果快取中的某一頁資料被修改了,還沒有儲存到磁碟上,這頁被稱為「髒頁」。有多種策略演算法能評估髒頁資料寫到磁碟上的最佳時機,而這也和事物強相關(事務是下一章節將展開的內容)。

關係型資料庫原理

這篇文章是對知乎上如何自己實現乙個關係型資料庫的乙個嘗試性回答,後續會不斷更新。對外資料模型為關係型資料庫,內部的實現主要分成兩大類,一類是disk based,比如mysql,postgres,一類是memory based,後者包括memsql,sap haha,oceanbase。這裡說乙個d...

關係型資料庫工作原理 資料庫整體框架 4

所謂的資料庫是指一組易於訪問和修改的資料集合。但是,但是一組簡單的檔案也能實現這個功能。實際上,最近簡單的一些資料庫系統如sqllite實現的功能與一組檔案沒有大的差異。但是,sqllite可以算作設計得非常優秀的一組檔案。因為它支援 通過事務管理保證了資料的安全性和一致性。大資料快速處理能力,能處...

關係型資料庫 和 非關係型資料庫(2)

一 關係型資料庫?1.概念 關係型資料庫是指採用了關係模型來組織資料的資料庫。簡單來說,關係模式就是二維 模型。主要代表 sql server,oracle,mysql,postgresql。2.優點 1 容易理解,二維表的結構非常貼近現實世界,二維 容易理解。2 使用方便,通用的sql語句使得操作...