最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL?InnoDB引擎的緩存特性詳解

 更新時(shí)間:2022年09月13日 08:41:31   作者:Amos01  
這篇文章主要介紹了MySQL?InnoDB引擎的緩存特性詳解的相關(guān)資料,需要的朋友可以參考下

1. 背景

對(duì)于各種用戶數(shù)據(jù)、索引數(shù)據(jù)等各種數(shù)據(jù)都是需要持久化存儲(chǔ)到磁盤,然后以“頁(yè)”為單位進(jìn)行讀寫。

相對(duì)于直接讀寫緩存,磁盤IO的成本相當(dāng)高昂。

對(duì)于讀取的頁(yè)面數(shù)據(jù),并不是使用完就釋放掉,而是放到緩沖區(qū),因?yàn)橄乱淮尾僮饔锌赡苓€需要讀區(qū)該頁(yè)面。

對(duì)于修改過的頁(yè)面數(shù)據(jù),也不是馬上同步到磁盤,也是放到緩沖區(qū),因?yàn)橄乱淮斡锌赡苓€會(huì)修改該頁(yè)面的數(shù)據(jù)。

但是緩存的空間是有大小限制的,不可能無(wú)限擴(kuò)充。

對(duì)于緩沖區(qū)的數(shù)據(jù),需要有合理的頁(yè)面淘汰算法,將未來(lái)使用概率較小的頁(yè)面釋放或者同步到磁盤,

給當(dāng)下需要存放到緩存的頁(yè)面騰出位置。

2. 存儲(chǔ)器性能差異

寄存器:CPU暫存指令、數(shù)據(jù)的小型存儲(chǔ)區(qū)域,速度快,容量小。

CPU高速緩存(CPU Cache):用于減少CPU訪問內(nèi)存所需平均時(shí)間的部件。

內(nèi)存:用于暫時(shí)存放CPU中的運(yùn)算數(shù)據(jù),以及與硬盤等外部存儲(chǔ)器交換的數(shù)據(jù)。

硬盤:分為固態(tài)硬盤(SSD)和機(jī)械硬盤(HHD),是非易失性存儲(chǔ)器。

下圖是各種緩存器的價(jià)格和性能差距,

從下圖可以看出,SSD的隨機(jī)訪問延時(shí)在微妙級(jí)別,而內(nèi)存的的隨機(jī)訪問延時(shí)在納秒級(jí)別,內(nèi)存比SSD大概快1000倍左右。

3. Buffer Pool

一個(gè)緩沖池(緩沖池)是向操作系統(tǒng)申請(qǐng)的一塊內(nèi)存空間,這塊內(nèi)存空間由多個(gè)chunk組成,每個(gè)chunk均包含多個(gè)控制塊和對(duì)應(yīng)的緩沖頁(yè)。

chunk是向操作系統(tǒng)申請(qǐng)內(nèi)存的最小單位,緩沖頁(yè)大小與InnoDB表空間使用的頁(yè)面大小一致。

Buffer Pool的示意圖如下

每一個(gè)控制塊都對(duì)應(yīng)一個(gè)緩沖頁(yè),控制塊包含該緩沖頁(yè)所屬的表空間編號(hào)、頁(yè)號(hào)、在Buffer Pool中的地址、鏈表結(jié)點(diǎn)信息等等。

當(dāng)剛讀取一個(gè)頁(yè)面時(shí),需要知道緩沖區(qū)有哪些空閑頁(yè)面,當(dāng)修改過后緩沖頁(yè)后,需要記錄該緩沖頁(yè)需要持久化到磁盤,

當(dāng)緩沖區(qū)沒有空閑頁(yè)面了,需要有頁(yè)面淘汰算法來(lái)將緩沖頁(yè)移出緩沖區(qū),

以上涉及到Free鏈表、Flush鏈表、LRU鏈表,下面注意說明。

4. Free鏈表

Free鏈表是由空閑的緩沖頁(yè)對(duì)應(yīng)的控制塊組成的鏈表,通過Free鏈表就獲取到空閑的緩沖頁(yè)及其在緩沖區(qū)中的地址。

每當(dāng)需要從磁盤加載一個(gè)頁(yè)面到緩沖區(qū)時(shí),從該Free鏈表取出一個(gè)控制塊結(jié)點(diǎn),從Free鏈表移除該結(jié)點(diǎn),并加入LRU鏈表。

如果這個(gè)緩沖區(qū)頁(yè)面被修改過,那么會(huì)被加入到Flush鏈表中。

5. Flush鏈表

如果一修改緩沖頁(yè)的數(shù)據(jù)之后就刷新到磁盤,這種頻繁的IO操作勢(shì)必影響程序等整體性能。

試想一下,先后修改1000次同一緩沖區(qū)頁(yè)面的一字節(jié)數(shù)據(jù),每次修改都刷新到磁盤,與修改1000次后再將最終結(jié)果刷新磁盤,節(jié)省了999次刷新磁盤的操作。

因此,當(dāng)頁(yè)面的數(shù)據(jù)被修改之后,需要將改頁(yè)面放到Flush鏈表,排隊(duì)等候?qū)懭氪疟P。

這既可以減少在用戶進(jìn)程中刷新磁盤的次數(shù),也從整體上減少了磁盤IO到次數(shù)。

6. LRU鏈表

內(nèi)存空間有限,不可能將所有數(shù)據(jù)都緩存在內(nèi)存當(dāng)中,因此需要有一定的算法將內(nèi)存中頁(yè)面淘汰掉(修改過的頁(yè)面持久化到磁盤)。

LRU(Least Recently Used)鏈表主要用于輔助實(shí)現(xiàn)內(nèi)存頁(yè)面淘汰,故名思義,最先淘汰的是最近最少使用的緩沖頁(yè)。

LRU鏈表的結(jié)果如下圖所示

將LRU鏈表分為young區(qū)域和old區(qū)域。

對(duì)于初次加載到緩沖區(qū)的頁(yè)面,會(huì)放到LRU鏈表old區(qū)域的頭部,這主要避免了預(yù)讀的頁(yè)面被放到了LRU鏈表的首部。

當(dāng)?shù)诙卧L問緩沖頁(yè)且時(shí)間間隔超過innodb_old_blocks_time(默認(rèn)1s)時(shí),才將該頁(yè)面移動(dòng)到LRU鏈表的首部。

進(jìn)一步,為了避免頻繁的移動(dòng)鏈表結(jié)點(diǎn),當(dāng)某個(gè)緩沖頁(yè)已經(jīng)在young區(qū)域的前3/4時(shí),則不會(huì)移動(dòng)該結(jié)點(diǎn)到首部。

7. 其它

如何定位頁(yè)面是否被緩沖呢?

表空間號(hào)和頁(yè)號(hào)可以唯一識(shí)別緩沖頁(yè),因此InnoDB引擎建立了以表空間號(hào)+頁(yè)號(hào)為key,以緩沖頁(yè)控制塊地址為value的哈希表,

從而快速判斷頁(yè)面是否被緩沖,快速定位到數(shù)據(jù)所在地址。

到此這篇關(guān)于MySQL InnoDB引擎的緩存特性詳解的文章就介紹到這了,更多相關(guān)MySQL InnoDB 緩存特性內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL修改密碼方法匯總

    MySQL修改密碼方法匯總

    本文中小編給大家匯總介紹了MySQL修改密碼的方法,分為MySQL5.7版本之前以及MySQL5.7版本之后的修改方法,有需要的小伙伴可以參考下
    2018-08-08
  • mysql 中存在null和空時(shí)創(chuàng)建唯一索引的方法

    mysql 中存在null和空時(shí)創(chuàng)建唯一索引的方法

    據(jù)庫(kù)默認(rèn)值都有null,此時(shí)創(chuàng)建唯一索引時(shí)要注意了,此時(shí)數(shù)據(jù)庫(kù)會(huì)把空作為多個(gè)重復(fù)值
    2014-10-10
  • Mysql中Row size too large (> 8126) 錯(cuò)誤的問題解決

    Mysql中Row size too large (> 8126)&n

    本文主要介紹了Mysql中Row size too large (> 8126) 錯(cuò)誤的問題解決,原因?qū)嵅迦氲男袛?shù)據(jù)可能太大了,超過了設(shè)定的闕值,下面就來(lái)看一下如何解決
    2024-07-07
  • 詳解如何校驗(yàn)MySQL及Oracle時(shí)間字段合規(guī)性

    詳解如何校驗(yàn)MySQL及Oracle時(shí)間字段合規(guī)性

    這篇文章主要為大家介紹了如何校驗(yàn)MySQL及Oracle時(shí)間字段合規(guī)性詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • MySQL數(shù)據(jù)庫(kù)導(dǎo)出與導(dǎo)入及常見錯(cuò)誤解決

    MySQL數(shù)據(jù)庫(kù)導(dǎo)出與導(dǎo)入及常見錯(cuò)誤解決

    MySQL數(shù)據(jù)庫(kù)導(dǎo)出與導(dǎo)入的過程中將會(huì)發(fā)生眾多不可預(yù)知的錯(cuò)誤,本文整理了一些常見錯(cuò)誤及相應(yīng)的解決方法,遇到類似情況的朋友可以參考下,希望對(duì)大家有所幫助
    2013-07-07
  • MySQL獲取系統(tǒng)性能和狀態(tài)代碼

    MySQL獲取系統(tǒng)性能和狀態(tài)代碼

    使用MySQL獲取系統(tǒng)性能和狀態(tài)的代碼片段,由此需求的朋友可以參考下,希望對(duì)大家有所幫助
    2013-07-07
  • mysql-connector-java.jar包的下載過程詳解

    mysql-connector-java.jar包的下載過程詳解

    這篇文章主要介紹了mysql-connector-java.jar包的下載過程詳解,mysql-connector-java.jar是java連接使用MySQL是必不可少的,感興趣的可以了解一下
    2020-07-07
  • MySQL切分函數(shù)substring()的具體使用

    MySQL切分函數(shù)substring()的具體使用

    這篇文章主要介紹了MySQL切分函數(shù)substring()的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • CentOS安裝mysql5.7 及簡(jiǎn)單配置教程詳解

    CentOS安裝mysql5.7 及簡(jiǎn)單配置教程詳解

    這篇文章主要介紹了CentOS安裝mysql5.7 及簡(jiǎn)單配置教程詳解,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-02-02
  • Mysql?COUNT()函數(shù)基本用法及應(yīng)用詳解

    Mysql?COUNT()函數(shù)基本用法及應(yīng)用詳解

    這篇文章主要介紹了Mysql?COUNT()函數(shù)基本用法及應(yīng)用的相關(guān)資料,COUNT()函數(shù)是SQL中常用的聚合函數(shù),用于統(tǒng)計(jì)滿足特定條件的記錄數(shù),它可以靈活地應(yīng)用于各種查詢場(chǎng)景,幫助用戶快速獲取所需的數(shù)據(jù)統(tǒng)計(jì)信息,需要的朋友可以參考下
    2024-12-12

最新評(píng)論

安图县| 巨野县| 竹北市| 五常市| 芒康县| 新疆| 苏州市| 东光县| 古交市| 高青县| 三穗县| 乐都县| 泽普县| 庐江县| 阳春市| 三亚市| 通渭县| 怀宁县| 莎车县| 高要市| 泸水县| 青神县| 武隆县| 大石桥市| 新巴尔虎右旗| 永吉县| 海原县| 浮梁县| 基隆市| 崇明县| 清新县| 城市| 姚安县| 株洲市| 鞍山市| 彭州市| 定边县| 开鲁县| 集安市| 阿尔山市| 九龙坡区|