《DBNotes: Buffer Pool對于緩沖頁的鏈表式管理》

目錄

  • Buffer Pool回顧
  • Buffer Pool內部組成
  • freelist
  • flushlist
  • LRU鏈表管理以及改進

Buffer Pool回顧

我們知道針對數據庫的增刪改刪操作都是在Buffer Pool中完成的,一條sql的執行步驟可以認為是這樣的:

1、innodb存儲引擎首先在緩沖池中查詢有沒有對應的數據,有就直接返回
2、如果不存在,則去磁盤進行加載,并加入緩沖池
3、同時該記錄會被加上獨占鎖,防止多人修改,出現數據不一致

而且我們知道,可以通過設置my.cnf配置中的innodb_buffer_pool_size來修改緩沖池大小,加快sql查詢速度,當然也需要注意設置過大會造成系統swap空間被占用,導致系統變慢降低查詢性能。

Buffer Pool內部組成

緩沖池對應一片連續內存,我們將其劃分為大小為16kb的頁(與innodb對應),這些頁稱為緩沖頁。
為了很好的管理這些頁,設計者為每個緩沖頁都創建了一些控制信息:表空間編號、頁號、緩沖頁在緩沖池中的地址、鏈表節點信息等。將每個頁對應的控制信息占用的一塊內存稱為一個控制塊。控制塊與緩沖頁一一對應,都存放在緩沖池中。
在Mysql啟動時,會自己完成對緩沖池的初始化:向操作系統申請內存,自己劃分成若干對控制塊和緩沖頁。

freelist

當我們從磁盤中load一個數據頁到緩沖池中,我們應該放到哪個緩沖頁中呢?
很顯然我們應該把數據頁放到“空閑”的緩沖頁中。
設計者將所有空閑的緩沖頁對應的控制塊作為一個節點放到一個鏈表中,稱為freelist。每次從freelist中取出一個空閑的緩沖頁中,并且將該緩沖頁對應的控制塊信息填上,然后將該節點移除,表示緩沖頁已經被使用了

flushlist

當一個控制塊節點被從freelist中移除,說明該頁已經被使用了。如果這種“使用操作”是對數據進行修改的話,那么必定需要將該頁數據flush到磁盤上。但是每次修改一頁就將那一頁flush的話,磁盤IO占用率高。所以每次修改緩沖頁后,將這些臟頁控制塊放入一個fulshlist上。當flush時機到了,就把flushlist節點對應的緩沖頁刷新搭配磁盤上。

LRU鏈表管理以及改進

緩沖池內存有限,當freelist中沒有多余的空閑緩沖頁,就需要把某些舊的緩沖頁從緩沖池中移除,然后把新的數據頁放進來。為了提高內存命中率,使用LRU。
但是普通的LRU不能解決下面的問題;
1、加載到緩沖池的頁不一定被用到(針對于預讀)
2、如果有非常多的使用頻率低的頁被同時加載到緩沖池中,則可能會把那些使用頻率非常高的頁從緩沖池中淘汰。(針對全表掃描)
關于innodb對于LRU的改進見如鏈接:
MySQL——Innodb改進LRU算法
當然還有進一步的優化:
對于young區域的緩沖頁,每次訪問一個緩沖頁就要把它移動到LRU鏈表的頭部,開銷比較大。畢竟,young區域的緩沖頁都是熱點數據。所以我們可以這樣優化:只有被訪問的緩沖頁位于young區域1/4的后面時,才會被移動到LRU鏈表頭部。也就是說我們將young的前0.25部分稱為very young,very young里面的數據訪問不會移動到頭部,因為大家訪問頻率都是非常高的。
提醒一下,在LRUlist的節點不是freelist節點,可能是flushlist節點。不理解的話,再去上面看看兩個list定義。
然而這一切的目的只有一個:盡量高效地提高緩沖池命中率。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377073.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377073.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377073.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一個延時調用問題

如果用下面第1行的寫法,調用 [NSObject cancelPreviousPerformRequestsWithTarget:self selector:selector(removeFromSuperview) object:nil]; 可以生效 如果用下面第3行的寫法,調用 [NSObject cancelPreviousPerformRequestsWithTarget:self selector:…

onclicklistener 方法使用匯總

相信很多像我一樣的新手學習ANDROID開發會遇到這個問題,通過這幾天的歸類和總結,將我的理解寫在下面,歡迎大家一起前來討論: 以按鈕BUTTON的監聽事件為例,以下的監聽實現都是等價的: 1.使用接口繼承按鈕監聽…

《源碼分析轉載收藏向—數據庫內核月報》

月報原地址: 數據庫內核月報 現在記錄一下,我可能需要參考的幾篇文章吧,不然以后還得找: MySQL 代碼閱讀 MYSQL開源軟件源碼閱讀小技巧 MySQL 源碼分析 聚合函數(Aggregate Function)的實現過程 MySQL …

vim中的jk為什么是上下_JK的完整形式是什么?

vim中的jk為什么是上下JK:開玩笑 (JK: Just Kidding) JK is an abbreviation of "Just Kidding". JK是“ Just Kidding”的縮寫 。 It is an expression, which is commonly used in messaging or chatting on social media networking sites like Faceb…

百度歸來的學長做報告

今天下午下課到現在才總算閑下來,本來計劃這個時間應該是讀英語,做英語模擬題的時間,但是,我不得不寫點什么來記錄下剛才的事——在百度實習并且簽下工作的學長做報告。 原本認為每個人的成功(請允許我目前的眼光簽個好…

轉:Google論文之三----MapReduce

文章來自于:http://www.cnblogs.com/geekma/p/3139823.html MapReduce:大型集群上的簡單數據處理 摘要 MapReduce是一個設計模型,也是一個處理和產生海量數據的一個相關實現。用戶指定一個用于處理一個鍵值(key-value)…

合約 cd 模式_CD的完整形式是什么?

合約 cd 模式CD:光盤 (CD: Compact Disc) CD is an abbreviation of "Compact Disc". CD是“ Compact Disc”的縮寫 。 It is a digital optical disc originally developed to store the audio of recordings in the format of a data file used as a p…

《DBNotes:Join算法的前世今生》

目錄NestLoopJoin算法Simple Nested-Loop JoinIndex Nested-Loop JoinBlock Nested-Loop JoinBatched Key AccessHash Join算法In-Memory Join(CHJ)On-Disk Hash Join參考鏈接在8.0.18之前,MySQL只支持NestLoopJoin算法,最簡單的就是Simple NestLoop Joi…

如何解決迅雷插件導致IE10崩潰的問題

Windows 8里面帶的IE10酷不酷?沉浸式界面果然不同凡響,IE10讓人幾乎認不出來了!這是微軟的瀏覽器么?上面這張圖是Windows8下Metro UI的新界面IE10,不過當我們切換回傳統桌面的時候,也有IE10的經典版的。好吧…

UNITY3D與iOS交互解決方案

原地址:http://bbs.18183.com/thread-456979-1-1.html 本帖最后由 啊,將進酒 于 2014-2-27 11:17 編輯 “授人以魚,不如授人以漁”,以UNITY3D調用iOS版的91SDK為例,利用C# / C / OBJ-C交互原理,本文將詳細介紹UNITY3D與iOS之間交互…

c:if equal_C ++中的std :: equal()

c:if equalequal()作為STL函數 (equal() as a STL function) Syntax: 句法: bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);Where, 哪里, InputIterator1 first iterator to start of the first sequence range I…

《DBNotes:Buffer Pool刷臟頁細節以及改進》

本筆記知識沿用之前DBNotes: Buffer Pool對于緩沖頁的鏈表式管理的部分知識 目錄獲取一個空閑頁的源碼邏輯Page_Cleaner_ThreadLRU_Manager_ThreadHazard Pointer作為驅逐算法改進參考獲取一個空閑頁的源碼邏輯 任何一個讀寫請求都需要從Buffer pool來獲取所需頁面。如果需要的…

WordPress刪除數據中標題重復文章的方法

一種是刪除重復的方法是:使用插件,大家可以去官網上下載 二種刪除重復的方法是:登錄數據庫,使用sql語句刪除,具體的語句為如下代碼: CREATE TABLE my_tmp AS SELECT MIN(ID) AS col1 FROM wp_posts GROUP BY post_titl…

hibernate配置

hibernate.cfg.xml <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd&quo…

html中表單元素_HTML中的表單元素

html中表單元素1)<input>元素 (1) The <input> Element) The <input> element is used to get input from the user in an HTML form. <input>元素用于以HTML形式從用戶獲取輸入。 <input> tag is used to get input using input element, the …

《搜索算法——DFS、BFS、回溯》

目錄深搜200. 島嶼數量695. 島嶼的最大面積130. 被圍繞的區域547. 省份數量417. 太平洋大西洋水流問題回溯廣搜111. 二叉樹的最小深度752. 打開轉盤鎖深搜與廣搜結合934. 最短的橋深搜 深搜DFS&#xff0c;在搜索到一個新節點時&#xff0c;立即對該新節點進行遍歷&#xff0c…

AP in R

AP聚類算法是目前十分火的一種聚類算法&#xff0c;它解決了傳統的聚類算法的很多問題。不僅簡單&#xff0c;而且聚類效果還不錯。這里&#xff0c;把前兩天學習的AP算法在R語言上面的模擬&#xff0c;將個人筆記拿出來與大家分享一下&#xff0c;不談AP算法的原理&#xff0c…

nginx 模塊解析

nginx的模塊非常之多&#xff0c;可以認為所有代碼都是以模塊的形式組織&#xff0c;這包括核心模塊和功能模塊&#xff0c;針對不同的應用場合&#xff0c;并非所有的功能模塊都要被用到&#xff0c;附錄A給出的是默認configure&#xff08;即簡單的http服務器應用&#xff09…

python關鍵字和保留字_Python關鍵字

python關鍵字和保留字關鍵詞 (Keywords) Keywords are the reserved words in Python programming language (and, any other programming languages like C, C, Java, etc) whose meanings are defined and we cannot change their meanings. In python programming languages…

《LeetcodeHot100非困難題補錄》

最近比較閑&#xff0c;也比較焦慮&#xff0c;刷刷題吧 目錄11. 盛最多水的容器22. 括號生成31. 下一個排列48. 旋轉圖像49. 字母異位詞分組56. 合并區間75. 顏色分類79. 單詞搜索114. 二叉樹展開為鏈表141. 環形鏈表148. 排序鏈表152. 乘積最大子數組169. 多數元素207. 課程表…