主頁 > 資料庫 > 什么是MySQL資料庫的快取池原理?看完或許就懂了

什么是MySQL資料庫的快取池原理?看完或許就懂了

2021-01-11 17:57:05 資料庫

前言

面試官:同學,你能說說Mysql 快取池嗎?

是CPP啊:啊,這么難嗎,容我組織一下語言,(內心OS:這TM還不簡單?我能給你扯半小時!)

面試官:可以,給你一分鐘時間想一想吧,

....一分鐘后....

是CPP啊:我準備好了,你可聽好,我要開始表演了,

為什么要有快取池?

MySQL 的 innodb 存盤引擎是基于磁盤存盤的,并且是按照頁的方式進行管理的,

在資料庫系統中,CPU 速度與磁盤速度之間的差距是非常大的,為了最大可能的彌補之間的差距,提出了快取池的概念,

所以快取池,簡單來說就是一塊「記憶體區域」,通過記憶體的速度來彌補磁盤速度較慢,導致對資料庫造成性能的影響,

快取池的基本原理

「讀操作」:

在資料庫中進行讀取頁的操作,首先把從磁盤讀到的頁存放在快取池中,下一次讀取相同的頁時,首先判斷該頁是不是在快取池中,

若在,稱該頁在快取池中被命中,則直接讀取該頁,否則,還是去讀取磁盤上的頁,

「寫操作」:

對于資料庫中頁的修改操作,首先修改在快取池中的頁,然后在以一定的頻率重繪到磁盤,并不是每次頁發生改變就重繪回磁盤,而是通過 checkpoint 的機制把頁重繪回磁盤,

可以看到,無論是讀操作還是寫操縱,都是對快取池進行操作,而不是直接對磁盤進行操縱,

快取池結構

Buffer Pool 是一片連續的記憶體空間,innodb 存盤引擎是通過頁的方式對這塊記憶體進行管理的,

快取池的結構如下圖:

可以看到快取池中包括資料頁、索引頁、插入快取、自適應哈希索引、鎖資訊、資料欄位,

其中資料頁和索引頁會用掉多數記憶體,

「但是,innodb 是如何管理快取池中的這么多頁呢?」

為了更好管理這些快取的頁,innodb 為每一個快取頁都創建了一些所謂的控制資訊,這些控制資訊包括該頁所屬的:

  • 表空間編號(sapce id)
  • 頁號(page numeber)
  • 頁 在 buffer Pool 的地址
  • 一些鎖資訊以及 LSN 資訊日志序列號
  • 其他控制資訊

每個快取頁對應的控制資訊占用的記憶體大小是相同的,我們把每個頁對應的控制資訊占用的一塊記憶體稱為一個「控制塊」,

「控制塊」和快取頁是一一對應的,它們都被存放到 Buffer Pool 中,其中控制塊被存放到 Buffer Pool 的前邊,快取頁被存放到 Buffer Pool 的后邊,

Buffer Pool 對應的記憶體空間示意圖:

快取池引數設定

  • innodb_buffer_pool_size:快取池的大小最多應設定為物理記憶體的 80%
  • innodb_buffer_pool_instance:設定有多少個快取池,通常建議把快取池個數設定為 CPU 的個數,多個快取池可以減少資料庫內部的資源競爭,增加資料庫并發訪問的能力
  • innodb_old_blocks_pct:老生代占整個 LRU 的鏈長比例,默認是 3:7
  • innodb_old_blocks_time:老生代停留時間視窗,單位是毫秒,默認是 1000,即同時滿足“被訪問”與“在老生代停留時間超過 1 秒”兩個條件,才會被插入到新生代頭部

快取池管理

「管理快取池依賴的鏈表結構」:

Free 鏈表

當啟動 Mysql 服務器的時候,需要完成對 Buffer Pool 的初始化程序,即分配 Buffer Pool 的記憶體空間,把它劃分為若干對控制塊和快取頁,但是此時并沒有真正的磁盤頁被快取到 Buffer Pool 中,之后隨著程式的運行,會不斷的有磁盤上的頁被快取到 Buffer Pool 中,

在使用程序中,為了記錄哪些快取頁是可用的,我們把所有空閑的頁包裝成一個節點組成一個鏈表,這個鏈表可以稱作為 Free 鏈表(空閑鏈表),因為剛剛完成初始化的 Buffer Pool 中所有的快取頁都是空閑的,所以每一個快取頁都會被加入到 Free 鏈表中,

為了方便管理 Free 鏈表,特意為這個鏈表定義了一些「控制資訊」,里面包含鏈表的頭節點地址,尾節點地址,以及當前鏈表中節點的數量等資訊,

另外會在每個 Free 鏈表的節點中都記錄了某個「快取頁控制塊」的地址,而每個「快取頁控制塊」都記錄著對應的「快取頁地址」,所以相當于每個 Free 鏈表節點都對應一個空閑的快取頁,

給大家畫了個結構圖:

這圖怎么樣,這下能看得懂了吧!

2、Lru 鏈表

Lru 鏈表用來管理已經讀取的頁,當資料庫剛啟動時,Lru 鏈表是空的,此時頁也都放在 Free 串列中,當需要讀取資料時,會從 Free 鏈表中申請一個頁,把從放入到磁盤讀取的資料放入到申請的頁中,這個頁的集合叫做 Lru 鏈表,

3、Flush 鏈表

Flush 鏈表用來管理被修改的頁,Buffer Pool 中被修改的頁也被稱之為「臟頁」,臟頁既存在于 Lru 鏈表中,也存在于 Flush 鏈表中,Flush 鏈表中存的是一個指向 Lru 鏈表中具體資料的指標,

因此只有 Lru 鏈表中的頁第一次被修改時,對應的指標才會存入到 Flush 中,若之后再修改這個頁,則是直接更新 Lru 鏈表中的頁對應的資料,

這三者之間是這么個關系:

讀操作

Buffer Pool 一個最主要的功能是「加速讀」,加速讀是當需要訪問一個資料頁面的時候,如果這個頁面已經在快取池中,那么就不再需要訪問磁盤,直接從緩沖池中就能獲取這個頁面的內容,當我們需要訪問某個頁中的資料時,就會把該頁加載到 Buffer Pool 中,如果該頁已經在 Buffer Pool 中的話直接使用就可以了,

問題:那么如何快速查找在 Buffer Pool 中的頁呢?

為了避免查詢資料頁時掃描 Lru,其實是根據表空間號 + 頁號來定位一個頁的,

也就相當于表空間號 + 頁號是一個 key,快取頁就是對應的 value,

用表空間號 + 頁號作為 key,快取頁作為 value 創建一個哈希表,在需要訪問某個頁的資料時,先從哈希表中根據表空間號 + 頁號看看有沒有對應的快取頁,

如果有,直接使用該快取頁就好,

如果沒有,那就從 Free 鏈表中選一個空閑的快取頁,然后把磁盤中對應的頁加載到該快取頁的位置,

每當需要從磁盤中加載一個頁到 Buffer Pool 中時,就從 Free 鏈表中取一個空閑的快取頁,并且把該快取頁對應的控制塊的資訊填上,然后把該快取頁對應的 Free 鏈表節點從鏈表中移除,表示該快取頁已經被使用了,并且把該頁寫入 Lru 鏈表,

在初始化的時候,Buffer pool 中所有的頁都是空閑頁,需要讀資料時,就會從 Free 鏈表中申請頁,但是物理記憶體不可能無限增大,資料庫的資料卻是在不停增大的,所以 Free 鏈表的頁是會用完的,

因此需要考慮把已經快取的頁從 Buffer pool 中洗掉一部分,進而需要考慮如何洗掉及洗掉哪些已經快取的頁,假設一共訪問了 n 次頁,那么被訪問的頁在快取中的次數除以 n 就是快取命中率,快取命中率越高,和磁盤的 IO 互動也就越少 ,

為了提高快取命中率,InnoDB 在傳統 Lru 演算法的基礎上做了優化,解決了兩個問題:1、預讀失效 2、快取池污染

寫操作

Buffer pool 另一個主要的功能是「加速寫」,即當需要修改一個頁面的時候,先將這個頁面在緩沖池中進行修改,記下相關的重做日志,這個頁面的修改就算已經完成了,

被修改的頁面真正重繪到磁盤,這個是后臺重繪執行緒來完成的,前面頁面更新是在快取池中先進行的,那它就和磁盤上的頁不一致了,這樣的快取頁被稱為臟頁(dirty page),

問題:這些被修改的頁面什么時候重繪到磁盤?以什么樣的順序重繪到磁盤?

最簡單的做法就是每發生一次修改就立即同步到磁盤上對應的頁上,但是頻繁的往磁盤中寫資料會嚴重的影響程式的性能,所以每次修改快取頁后,不能立即把修改同步到磁盤上,而是在未來的某個時間點進行同步,由后臺重繪執行緒依次重繪到磁盤,實作修改落地到磁盤,

但是如果不立即同步到磁盤的話,那之后再同步的時候如何判斷 Buffer Pool 中哪些頁是臟頁,哪些頁從來沒被修改過呢?

InnoDB 并沒有一次性把所有的快取頁都同步到磁盤上,InnoDB 創建一個存盤臟頁的鏈表,凡是在 Lru 鏈表中被修改過的頁都需要加入這個鏈表中,因為這個鏈表中的頁都是需要被重繪到磁盤上的,所以這個鏈表也叫 Flush 鏈表,鏈表的構造和 Free 鏈表一致,

這里的臟頁修改指的此頁被加載進 Buffer Pool 后第一次被修改,只有第一次被修改時才需要加入 Flush 鏈表,對于已經存在在 Flush 鏈表中的頁,如果這個頁被再次修改就不會再放到 Flush 鏈表,

需要注意,臟頁資料實際還在 Lru 鏈表中,而 Flush 鏈表中的臟頁記錄只是通過指標指向 Lru 鏈表中的臟頁,并且在 Flush 鏈表中的臟頁是根據 oldest_lsn(這個值表示這個頁第一次被更改時的 lsn 號,對應值 oldest_modification,每個頁頭部記錄)進行排序重繪到磁盤的,值越小表示要最先被重繪,避免資料不一致,

最后

是cpp呀:面試官,我就先說這些吧!

面試官:行,回答的還湊合,(內心OS:這小子知道的還挺多啊!)

是cpp呀:我可謝謝您嘞!喜歡的朋友記得關注,看下圖了解更多噢~有學習驚喜O

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/247334.html

標籤:其他

上一篇:數倉建設中最常用模型--Kimball維度建模詳解

下一篇:postgresql 角色權限

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more