国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

InnoDB引擎之flush臟頁

這篇具有很好參考價值的文章主要介紹了InnoDB引擎之flush臟頁。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

利用 WAL 技術(shù),數(shù)據(jù)庫將隨機(jī)寫轉(zhuǎn)換成了順序?qū)?,大大提升了?shù)據(jù)庫的性能,由此也帶來了內(nèi)存臟頁的問題。

?臟頁會被后臺線程自動 flush,也會由于數(shù)據(jù)頁淘汰而觸發(fā) flush,而刷臟頁的過程由于會占用資源,可能會讓你的更新和查詢語句的響應(yīng)時間長一些。

?

一、flush 臟頁

當(dāng)內(nèi)存數(shù)據(jù)頁跟磁盤數(shù)據(jù)頁內(nèi)容不一致的時候,我們成這個內(nèi)存頁為“臟頁”;內(nèi)存數(shù)據(jù)寫入磁盤后,內(nèi)存和磁盤上的數(shù)據(jù)頁內(nèi)容就一致了,稱為“干凈頁”。

?文章來源地址http://www.zghlxwxcb.cn/news/detail-409608.html

InnoDB引擎以頁作為磁盤和內(nèi)存之間交互的基本單位,數(shù)據(jù)庫 I/O 操作的最小單位是頁。也就是說,在數(shù)據(jù)庫中,不論讀一行,還是讀多行,都是將這些行所在的頁進(jìn)行加載。

InnoDB引擎之flush臟頁

?

?

?

記錄是按照行來存儲的,但是數(shù)據(jù)庫的讀取并不以行為單位,否則一次讀?。ㄒ簿褪且淮?I/O 操作)只能處理一行數(shù)據(jù),效率會非常低。?

Buffer Pool 中存的就是一頁一頁的數(shù)據(jù),當(dāng)我們要查詢的數(shù)據(jù)不在 Buffer Pool 中時,InnoDB 會將記錄所在的頁整個加載到 Buffer Pool 中去。

同樣的,將 Buffer Pool 中的臟頁刷入磁盤時,也是按照頁為單位刷入磁盤的。

??

1、Free List

你從磁盤中讀取一個數(shù)據(jù)頁,會先從Free List中找出一個空閑緩存頁的描述信息,然后將你讀出的數(shù)據(jù)頁中加載進(jìn)緩存頁中。同時將緩存頁的描述信息從Free List中剔除,此外該描述信息塊還會被維護(hù)進(jìn)LRU鏈表中。

數(shù)據(jù)頁被加載進(jìn)Buffer Pool后你就可以對其進(jìn)行變更操作了。

?

3、Flush List

如果我們修改了Buffer Pool中某個緩沖頁的數(shù)據(jù),那么它就與磁盤上的頁不一致了,這樣的緩沖頁也被稱之為臟頁(dirty page)。

為了性能問題,我們每次修改緩沖頁后,并不著急立刻把修改刷新到磁盤上,而是在未來的某個時間點(diǎn)進(jìn)行刷新操作。?

如果有了修復(fù)發(fā)生,不是立刻刷新,那之后再刷新的時,我們怎么知道Buffer Pool中哪些頁是臟頁,哪些頁從來沒有被修改過呢?

?

創(chuàng)建一個存儲臟頁的 Flush list,凡是被修改過的緩沖頁對應(yīng)的控制塊都會作為節(jié)點(diǎn)加入到這個鏈表中。

4、LRU List

除了以上,Buffer Pool還有另外一種LRU List,整體結(jié)構(gòu)如下:

?

InnoDB引擎之flush臟頁

?

?

?

在BufferPool中,內(nèi)存管理如下:

  • 需要找 free 空閑數(shù)據(jù)塊:free list
  • 需要找冷熱訪問的數(shù)據(jù)塊:lru list
  • 需要知道哪些數(shù)據(jù)塊是臟的:flush list

?

?

二、刷新方式有哪幾種

1、從flush鏈表中刷新一部分頁面到磁盤

?

后臺線程會根據(jù)當(dāng)時系統(tǒng)的繁忙程度確定刷新速率,定時從flush鏈表中刷新一部分頁面到磁盤,即:BUF_FLUSH_LIST

?有時后臺線程刷新臟頁的進(jìn)度比較慢,導(dǎo)致用戶準(zhǔn)備加載一個磁盤頁到Buffer Pool中時沒有可用的緩沖頁。此時,就會嘗試查看LRU鏈表尾部,看是否存在可以直接釋放掉的未修改緩沖頁。

如果沒有,則不得不將LRU鏈表尾部的一個臟頁同步刷新到磁盤(與磁盤交互是很慢的,這會降低處理用戶請求的速度),即:BUF_FLUSH_SINGLE_PAGE

?

2、從LRU鏈表的冷數(shù)據(jù)中刷新一部分頁面到磁盤,即:BUF_FLUSH_LRU

?

后臺線程會定時從LRU鏈表的尾部開始掃描一些頁面,掃描的頁面數(shù)量可以通過系統(tǒng)變量innodb_lru_scan_depth來指定,如果在LRU鏈表中發(fā)現(xiàn)臟頁,則把它們刷新到磁盤。

控制塊里會存儲該緩沖頁是否被修改的信息,所以在掃描LRU鏈表時,可以很輕松地獲取到某個緩沖頁是否是臟頁的信息。

?

三、flush性能問題

flush臟頁雖然是常態(tài),但是出現(xiàn)以下這兩種情況,都是會明顯影響性能的:

  1. 一個查詢要淘汰的臟頁個數(shù)太多,會導(dǎo)致查詢的響應(yīng)時間明顯變長;
  2. 日志寫滿,更新全部堵住,寫性能跌為 0,這種情況對敏感業(yè)務(wù)來說,是不能接受的。

?

InnoDB 會在后臺刷臟頁,而刷臟頁的過程是要將內(nèi)存頁寫入磁盤。所以,無論是你的查詢語句在需要內(nèi)存的時候可能要求淘汰一個臟頁,還是由于刷臟頁的邏輯會占用 IO 資源并可能影響到了你的更新語句,都可能是造成你從業(yè)務(wù)端感知到 MySQL“抖”了一下的原因。

?

要盡量避免這種情況,你就要合理地設(shè)置 innodb_io_capacity 的值,并且平時要多關(guān)注臟頁比例,不要讓它經(jīng)常接近 75%。?

一旦一個查詢請求需要在執(zhí)行過程中先 flush 掉一個臟頁時,這個查詢就可能要比平時慢了。

而 MySQL 中的一個機(jī)制,可能讓你的查詢會更慢:在準(zhǔn)備刷一個臟頁的時候,如果這個數(shù)據(jù)頁旁邊的數(shù)據(jù)頁剛好是臟頁,就會把這個“鄰居”也帶著一起刷掉;而且這個把“鄰居”拖下水的邏輯還可以繼續(xù)蔓延,也就是對于每個鄰居數(shù)據(jù)頁,如果跟它相鄰的數(shù)據(jù)頁也還是臟頁的話,也會被放到一起刷。

?

在 InnoDB 中,innodb_flush_neighbors 參數(shù)就是用來控制這個行為的,值為 1 的時候會有上述的“連坐”機(jī)制,值為 0 時表示不找鄰居,自己刷自己的。

找“鄰居”這個優(yōu)化在機(jī)械硬盤時代是很有意義的,可以減少很多隨機(jī) IO。機(jī)械硬盤的隨機(jī) IOPS 一般只有幾百,相同的邏輯操作減少隨機(jī) IO 就意味著系統(tǒng)性能的大幅度提升。

而如果使用的是 SSD 這類 IOPS 比較高的設(shè)備的話,建議你把 innodb_flush_neighbors 的值設(shè)置成 0。因?yàn)檫@時候 IOPS 往往不是瓶頸,而“只刷自己”,就能更快地執(zhí)行完必要的刷臟頁操作,減少 SQL 語句響應(yīng)時間。

在 MySQL 8.0 中,innodb_flush_neighbors 參數(shù)的默認(rèn)值已經(jīng)是 0 了。

?

參考資料:

https://hackmysql.com/post/book-6/

《MySQL實(shí)戰(zhàn)45講》

?

?

?

到了這里,關(guān)于InnoDB引擎之flush臟頁的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【搜索引擎數(shù)據(jù)庫】

    一、搜索引擎數(shù)據(jù)庫簡介 1.1、? 搜索引擎數(shù)據(jù)庫簡介 ? ? ? 通常意義上的數(shù)據(jù)庫即指數(shù)據(jù)庫系統(tǒng)(Database System,簡稱 DBS),由數(shù)據(jù)庫、數(shù)據(jù)庫管 理系統(tǒng)、應(yīng)用程序、管理員四部分組成。DBMS 是數(shù)據(jù)庫 系統(tǒng)的基礎(chǔ)和核心,作為能夠使用戶定義、創(chuàng)建、維護(hù)和控制訪問數(shù)據(jù)庫的

    2023年04月17日
    瀏覽(87)
  • MySQL 數(shù)據(jù)庫存儲引擎

    MySQL 數(shù)據(jù)庫存儲引擎

    目錄 一、存儲引擎簡介 二、MyISAM存儲引擎 1、MylSAM介紹 2、MyISAM表支持3種不同的存儲格式 3、MylSAM的特點(diǎn) 4、MyISAM使用的生產(chǎn)場景 三、InnoDB存儲引擎 1、InnoDB介紹 2、InnoDB的特點(diǎn) 3、InnoDB適用生產(chǎn)場景 4、MyISAM和InnoDB的區(qū)別 四、查看和修改存儲引擎 1、查看系統(tǒng)支持的存儲引擎

    2023年04月25日
    瀏覽(94)
  • mysql 數(shù)據(jù)庫引擎介紹

    mysql 數(shù)據(jù)庫引擎介紹

    一、數(shù)據(jù)庫引擎 ? ? 數(shù)據(jù)庫引擎是用于存儲、處理和保護(hù)數(shù)據(jù)的核心服務(wù)。利用數(shù)據(jù)庫引擎可控制訪問權(quán)限并快速處理事務(wù),從而滿足企業(yè)內(nèi)大多數(shù)需要處理大量數(shù)據(jù)的應(yīng)用程序的要求。 使用數(shù)據(jù)庫引擎創(chuàng)建用于聯(lián)機(jī)事務(wù)處理或聯(lián)機(jī)分析處理數(shù)據(jù)的關(guān)系數(shù)據(jù)庫。這包括創(chuàng)建

    2024年02月14日
    瀏覽(89)
  • 數(shù)據(jù)庫搜索引擎介紹

    數(shù)據(jù)庫搜索引擎介紹

    索引的定義:索引是對數(shù)據(jù)庫表的一列或者多列的值進(jìn)行排序一種結(jié)構(gòu),使用索引可以快速訪問數(shù)據(jù)表中的特定信息。 通俗來講,索引就是數(shù)據(jù)庫表的一個目錄,通過索引,我們可以迅速的找到數(shù)據(jù)庫中的數(shù)據(jù),并進(jìn)行相應(yīng)的增刪改查等操作。 索引的使用大大加快數(shù)據(jù)檢索

    2024年02月03日
    瀏覽(94)
  • MySQL的數(shù)據(jù)庫引擎介紹

    MySQL的數(shù)據(jù)庫引擎介紹

    ? ? 數(shù)據(jù)庫引擎就是操作數(shù)據(jù)庫的一段程序或程序段,用于存儲、處理和保護(hù)數(shù)據(jù)的核心服務(wù)。 ????利用數(shù)據(jù)庫引擎可控制訪問權(quán)限并快速處理事務(wù),從而滿足企業(yè)內(nèi)大多數(shù)需要處理大量數(shù)據(jù)的應(yīng)用程序的要求。數(shù)據(jù)庫應(yīng)用項(xiàng)目是通過數(shù)據(jù)庫引擎與數(shù)據(jù)庫鏈接的。 ? ? 何為

    2024年02月06日
    瀏覽(97)
  • MySQL數(shù)據(jù)庫之存儲引擎

    MySQL數(shù)據(jù)庫之存儲引擎

    MySQL中的數(shù)據(jù)用各種不下同的技術(shù)存儲在文件中,每一種技術(shù)都使用不同的存儲機(jī)制、索引技巧、鎖定水平并最終提供不同的功能和能力,這些不同的技術(shù)以及配套的功能在MySQL中稱為存儲引擎。 存儲引擎是MySQL將數(shù)據(jù)存儲在文件系統(tǒng)中的存儲方式或者存儲格式。 存儲引擎是

    2024年02月03日
    瀏覽(96)
  • 數(shù)據(jù)庫簡史:多主數(shù)據(jù)庫架構(gòu)的由來和華為參天引擎的機(jī)遇

    數(shù)據(jù)庫簡史:多主數(shù)據(jù)庫架構(gòu)的由來和華為參天引擎的機(jī)遇

    注:本文發(fā)表后,收到了很多后臺反饋,其中關(guān)于大型機(jī)的早期成就不容省略。微調(diào)重發(fā)本文,純屬個人觀點(diǎn),錯謬之處,仍然期待指正。 2023年10月13日,在北京舉辦的“ 2023金融業(yè)數(shù)據(jù)庫技術(shù)大會 \\\"上,有一個非常重要的計(jì)劃低調(diào)地發(fā)起了。這就是 \\\"北京金融信息化研究所

    2024年02月08日
    瀏覽(86)
  • 大數(shù)據(jù)ClickHouse(五):數(shù)據(jù)庫引擎介紹與實(shí)例演示

    大數(shù)據(jù)ClickHouse(五):數(shù)據(jù)庫引擎介紹與實(shí)例演示

    文章目錄 數(shù)據(jù)庫引擎介紹與實(shí)例演示 一、Ordinary默認(rèn)數(shù)據(jù)庫引擎 二、MySQL數(shù)據(jù)庫引擎

    2024年02月03日
    瀏覽(95)
  • ClickHouse--04--數(shù)據(jù)庫引擎、Log 系列表引擎、 Special 系列表引擎

    ClickHouse--04--數(shù)據(jù)庫引擎、Log 系列表引擎、 Special 系列表引擎

    提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 ClickHouse 中支持在創(chuàng)建數(shù)據(jù)庫時指定引擎,目前比較常用的兩種引擎為默認(rèn)引擎 和 MySQL 數(shù)據(jù)庫引擎。 Ordinary 就是 ClickHouse 中默認(rèn)引擎,如果不指定數(shù)據(jù)庫引擎創(chuàng)建的就是Ordinary 數(shù)據(jù)庫引擎,在這種數(shù)據(jù)

    2024年02月20日
    瀏覽(90)
  • 【MySQL數(shù)據(jù)庫 | 第十六篇】存儲引擎

    【MySQL數(shù)據(jù)庫 | 第十六篇】存儲引擎

    目錄 ?前言: ?MySQL體系結(jié)構(gòu)圖: 存儲引擎簡介: 1. InnoDB存儲引擎: 2. MyISAM存儲引擎: 3. MEMORY存儲引擎: 4. NDB Cluster存儲引擎: 5. ARCHIVE存儲引擎: 存儲引擎語法: ACID與行級鎖: ?總結(jié): 經(jīng)過前面15篇的學(xué)習(xí),我們已經(jīng)學(xué)完了SQL的基本語法內(nèi)容,大致掌握了數(shù)據(jù)庫的操作

    2024年02月08日
    瀏覽(117)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包