Innodb Buffer Pool緩存機制(三)Innodb Buffer Pool內部組成

一、控制塊+緩存頁

??Buffer Pool中默認的緩存頁大小和在磁盤上默認的頁大小是一樣的,都是16KB。為了更好的管理這些在Buffer Pool中的緩存頁,InnoDB為每一個緩存頁都創建了一些所謂的控制信息,這些控制信息包括該頁所屬的表空間編號、頁號、緩存頁在Buffer Pool中的地址、鏈表節點信息、一些鎖信息以及LSN信息,當然還有一些別的控制信息。

??每個緩存頁對應的控制信息占用的內存大小是相同的,稱為控制塊。控制塊和緩存頁是一一對應的,它們都被存放到Buffer Pool 中,其中控制塊被存放到Buffer Pool的前邊,緩存頁被存放到Buffer Pool后邊,所以整個Buffer Pool對應的內存空間看起來就是這樣的:
在這里插入圖片描述

注:每個控制塊大約占用緩存頁大小的5%,而設置的innodb_buffer_pool_size并不包含這部分控制塊占用的內存空間大小,也就是說InnoDB在為Buffer Pool向操作系統申請連續的內存空間時,這片連續的內存空間一般會比innodb_buffer_pool_size的值大5%左右。

二、Free鏈表管理

MySQL服務在剛啟動的時候,需要完成對Buffer Pool的初始化,也就是向操作系統申請Buffer Pool的存儲空間,然后它們劃分為若干對控制塊和緩存頁

但此時還沒有使用,所以Buffer Pool中還沒有真實的頁數據,隨著程序運行,就會慢慢有磁盤頁數據被緩存在Buffer Pool中。

對于InnoDB來說,將磁盤頁讀取到Buffer Pool中有幾個關鍵問題,即哪些緩存頁是空閑,哪些緩存頁已經被使用了。

緩存頁對應的控制塊就起了大作用,可以把所有空閑的緩存頁對應的控制塊作為一個節點放到一個鏈表中,這個鏈表也可以被稱作free鏈表,或者說空閑鏈表。

剛完成初始化的Buffer Pool中所有的緩存頁都是空閑的,所以每一個緩存頁對應的控制塊都會被加入到free鏈表中,free鏈表的效果圖就是這樣的:

在這里插入圖片描述
有了這個free鏈表之后,每當需要從磁盤中加載一個頁到Buffer Pool中時,就從free鏈表中取一個空閑的緩存頁,并且把該緩存頁對應的控制塊的信息填上(就是該頁所在的表空間、頁號之類的信息),然后把該緩存頁對應的free鏈表節點從鏈表中移除,表示該緩存頁已經被使用了。

三、緩存頁的哈希處理

當訪問某個頁的數據時,如何知道該頁已經在Buffer Pool中了呢

InnoDB根據表空間號 + 頁號來定位一個頁,所以可以用表空間號 + 頁號作為key,緩存頁作為value創建一個哈希表,在需要訪問某個頁的數據時,先從哈希表中根據表空間號 + 頁號看看有沒有對應的緩存頁,如果有,直接使用該緩存頁就好,如果沒有,那就從free鏈表中選一個空閑的緩存頁,然后把磁盤中對應的頁加載到該緩存頁的位置。

四、flush鏈表管理

如果修改了Buffer Pool中某個緩存頁的數據,那它就和磁盤上的頁不一致了,這樣的緩存頁也被稱為臟頁(Dirty Page)

內存的數據修改后,要保證磁盤上的數據也同步進行修改,最簡單的做法就是每發生一次修改就立即同步到磁盤上對應的頁上,但是頻繁的往磁盤中寫數據會嚴重的影響程序的性能。所以每次修改緩存頁后,我們并不著急立即把修改同步到磁盤上,而是在未來的某個時間點進行同步。

在同步內存數據到磁盤中時,需要知道Buffer Pool中哪些緩存頁的數據發生了變化,所以同樣需要一個存儲臟頁的鏈表,凡是修改過的緩存頁對應的控制塊都會作為一個節點加入到一個鏈表中,因為這個鏈表節點對應的緩存頁都是需要被刷新到磁盤上的,所以也叫flush鏈表。鏈表的構造和free鏈表差不多。
在這里插入圖片描述

五、LRU鏈表管理

Buffer Pool的大小是有限的,free鏈表總歸有用完的時候,這個時候就涉及到緩存頁淘汰的問題了,把舊的緩存頁移除,然后把新的緩存頁放進來。

Buffer Pool的初衷就是為了減少磁盤IO的次數,緩存命中率越高越好

所以,Buffer Pool的淘汰策略使用LRU算法,淘汰最近最少使用的緩存頁,留下最近使用比較頻繁的緩存頁。

InnoDB為了知道哪些緩存頁是最近使用的,就需要再創建一個鏈表,該鏈表使用LRU算法來淘汰緩存頁,所以稱為LRU鏈表,當訪問某個頁時,它的工作過程如下:

  • 如果該頁不在Buffer Pool中,就把該頁從磁盤加載到Buffer Pool中的緩存頁時,然后把該緩存頁對應的控制塊作為節點塞到LRU鏈表的頭部;
  • 如果該頁已經緩存在Buffer Pool中,則直接把該頁對應的控制塊移動到LRU鏈表的頭部;

只要我們使用到某個緩存頁,就把該緩存頁調整到LRU鏈表的頭部,這樣LRU鏈表尾部就是最近最少使用的緩存頁。所以當Buffer Pool中的空閑緩存頁使用完時,到LRU鏈表的尾部找些緩存頁淘汰就可以了。

這種簡單的LRU鏈表其實是有一些問題,主要與InnoDB自生的一些特性和SQL語句有關。

mysql當然不會用這樣的LRU鏈表,它對了一下優化,詳情請見下一章。

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

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

相關文章

Android基礎-AndroidManifest.xml詳解

在Android開發中,AndroidManifest.xml 文件是一個至關重要的組成部分,它位于應用的根目錄的 app/src/main/ 文件夾下。這個文件提供了Android系統和其他應用所需的所有關于應用的元數據信息。以下是對 AndroidManifest.xml 文件的詳細解析。 1. 文件結構…

[Vulfocus解題系列]spring 命令執行(CVE-2022-22947)

環境部署 使用docker部署環境 漏洞等級:高危 3 月 1 日,VMware 官方發布安全公告,聲明對 Spring Cloud Gateway 中的一處命令注入漏洞進行了修復,漏洞編號為CVE-2022-22947 Spring官方發布 漏洞描述 使用 Spring Cloud Gate…

javaweb—Vue

重點為&#xff1a;雙向數據綁定。 框架&#xff1a;是一個半成品軟件&#xff0c;是一套可重用的、通用的、軟件基礎代碼模型&#xff0c;基于框架進行開發&#xff0c;更加快捷&#xff0c;更加高效。 Vue快速入門 基礎框架&#xff1a; <!DOCTYPE html> <html lan…

【Python Cookbook】S01E20 fnmatch 模塊做字符串匹配

目錄 問題解決方案討論 問題 在不同的操作系統下&#xff0c;怎樣做字符串匹配&#xff1f; 解決方案 fnmatch() 模塊提供兩個函數&#xff0c;fnmatch() 以及 fnmatchcase() 可以用來執行做這樣的匹配。 from fnmatch import fnmatch, fnmatchcasematch_res fnmatch(foo.…

vue路由緩存

vue路由緩存 在業務場景中有時候需要頁面緩存不清空&#xff0c;那么就需要保留緩存(include為需要緩存&#xff0c;而exclude為不緩存&#xff0c;且優先級大于include) <KeepAlive> 是一個內置組件&#xff0c;它的功能是在多個組件間動態切換時緩存被移除的組件實例…

【java 為什么說 Synchronized 是非公平鎖?】

文章目錄 概要1. 非公平鎖的定義2. synchronized 作為非公平鎖的原因3. 非公平鎖的特點4. 如何實現公平鎖總結 概要 在Java中&#xff0c;synchronized 關鍵字用于實現同步&#xff0c;以確保在多線程環境下對共享資源的訪問是線程安全的。然而&#xff0c;synchronized 實現的…

03-3.1.2 棧的順序存儲的實現

&#x1f44b; Hi, I’m Beast Cheng&#x1f440; I’m interested in photography, hiking, landscape…&#x1f331; I’m currently learning python, javascript, kotlin…&#x1f4eb; How to reach me --> 458290771qq.com 喜歡《數據結構》部分筆記的小伙伴可以訂…

郵件地址搜索軟件

易郵件地址搜索大師  一、易郵件地址搜索大師特色 — 易郵件地址搜索大師是一款搜索郵件地址和手機號碼的軟件&#xff0c;可以按整站搜索&#xff0c;也可以按關鍵詞搜索。使用方法非常簡單和方便。 — “整站搜索”可以搜索有很多郵件地址的單一網站&#xff0c;主要用于…

Technart電動螺絲刀TN101控制器維修

Technart電動螺絲刀以其高效、穩定和精確的扭矩控制而聞名。然而&#xff0c;即使優質的產品&#xff0c;在長時間的使用下&#xff0c;也可能會出現TECHNART電動螺母扳手控制器故障。 常見故障及維修方法 1. 控制器不工作 癥狀&#xff1a;電動螺絲刀無法啟動&#xff0c;或啟…

Python怎么染色:深入探索Python中的文本和圖形著色技巧

Python怎么染色&#xff1a;深入探索Python中的文本和圖形著色技巧 在Python編程中&#xff0c;染色或著色不僅限于文本輸出&#xff0c;還涉及圖形、圖像甚至數據可視化的多個層面。本文將帶你走進Python的染色世界&#xff0c;從四個方面、五個方面、六個方面和七個方面詳細…

【WEEK15】 【DAY2】【DAY3】Email Tasks【English Version】

Continuation from【WEEK15】 【DAY1】Asynchronous Tasks【English Version】 Contents 17. Asynchronous, Timed, and Email Tasks17.2. Email Tasks17.2.1. Email sending is also very common in our daily development, and Springboot provides support for this as well…

用戶的權限

一&#xff0c;用戶權限基礎知識 1&#xff0c;用戶的權限有&#xff1a; r&#xff1a;讀 w&#xff1a;寫 x&#xff1a;執行 2&#xff0c;文件的權限&#xff1a; r&#xff1a;可以執行cat、head、tail等命令讀取文件中的內容 w&#xff1a;可以用vi/vim或者重定向等…

JeecgBoot/SpringBoot升級Nacos(2.0.4到2.2.3)啟動報錯

錯誤如下&#xff1a; 報這種錯誤基本就很頭大了&#xff0c;是框架不兼容的問題&#xff0c;自己找很難找到解決方法。 解決方案是把SpringBoot框架版本調高。 修改前&#xff1a; <parent><groupId>org.springframework.boot</groupId><artifactId&g…

Dell戴爾XPS 16 9640 Intel酷睿Ultra9處理器筆記本電腦原裝出廠Windows11系統包,恢復原廠開箱狀態oem預裝系統

下載鏈接&#xff1a;https://pan.baidu.com/s/1j_sc8FW5x-ZreNrqvRhjmg?pwd5gk6 提取碼&#xff1a;5gk6 戴爾原裝系統自帶網卡、顯卡、聲卡、藍牙等所有硬件驅動、出廠主題壁紙、系統屬性專屬聯機支持標志、系統屬性專屬LOGO標志、Office辦公軟件、MyDell、邁克菲等預裝軟…

Linux基礎 (十四):socket網絡編程

我們用戶是處在應用層的&#xff0c;根據不同的場景和業務需求&#xff0c;傳輸層就要為我們應用層提供不同的傳輸協議&#xff0c;常見的就是TCP協議和UDP協議&#xff0c;二者各自有不同的特點&#xff0c;網絡中的數據的傳輸其實就是兩個進程間的通信&#xff0c;兩個進程在…

32C3-2模組與樂鑫ESP32--C3--WROOM--02模組原理圖、升級口說明

模組原理圖&#xff1a; 底板原理圖&#xff1a; u1 是AT通信口&#xff0c;wiif-tx wifi-rx 是升級口&#xff0c;chip-pu是reset復位口&#xff0c;GPIO9拉低復位進入下載模式 ESP32-WROOM-32 系列硬件連接管腳分配? 功能 ESP32 開發板/模組管腳 其它設備管腳 下載固件…

【Python報錯】AttributeError: ‘NoneType‘ object has no attribute ‘xxx‘

成功解決“AttributeError: ‘NoneType’ object has no attribute ‘xxx’”錯誤的全面指南 一、引言 在Python編程中&#xff0c;AttributeError是一種常見的異常類型&#xff0c;它通常表示嘗試訪問對象沒有的屬性或方法。而當我們看到錯誤消息“AttributeError: ‘NoneTyp…

激發AI創新潛能,OPENAIGC開發者大賽賽題解析

人工智能&#xff08;AI&#xff09;的飛速發展&#xff0c;特別是AIGC、大模型、數字人技術的成熟&#xff0c;不僅改變了數據處理和信息消費的方式&#xff0c;也為企業和個人提供了前所未有的機遇。在這種技術進步的背景下&#xff0c;由聯想拯救者、AIGC開放社區、英特爾共…

PostgreSQL的視圖pg_stat_database

PostgreSQL的視圖pg_stat_database pg_stat_database 是 PostgreSQL 中的一個系統視圖&#xff0c;用于提供與數據庫相關的統計信息。這個視圖包含了多個有用的指標&#xff0c;可以幫助數據庫管理員了解數據庫的使用情況和性能。 以下是 pg_stat_database 視圖的主要列和其含…

三生隨記——理發店詭事

在城市的邊緣&#xff0c;隱藏著一家不起眼的理發店。它沒有華麗的裝飾&#xff0c;也沒有喧囂的廣告&#xff0c;只是靜靜地矗立在一條狹窄的小巷盡頭。據說&#xff0c;這家店只在深夜營業&#xff0c;而且只接待那些真心尋求改變的人。 有一天&#xff0c;一個名叫林逸的年輕…