偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

MySQL 寫緩沖 (change buffer) 都不會(huì),還做什么架構(gòu)師?

開發(fā) 架構(gòu) MySQL
MySQL作為一個(gè)存儲(chǔ)系統(tǒng),同樣具有緩沖池(buffer pool)機(jī)制,以避免每次查詢數(shù)據(jù)都進(jìn)行磁盤IO。如果大家使用MySQL,那么InnoDB的緩沖池,是架構(gòu)師必須了解的內(nèi)容。

上篇《MySQL緩沖池(buffer pool)》,介紹了InnoDB緩沖池的工作原理。

有童鞋在評(píng)論里咨詢:對(duì)于讀請(qǐng)求,MySQL緩沖池能夠減少磁盤IO,提升性能,那對(duì)于寫請(qǐng)求,MySQL又是如何優(yōu)化的呢?今天和大家聊聊這個(gè)問題。

首先,簡(jiǎn)單回顧一下上一講的緩沖池:

  • MySQL數(shù)據(jù)存儲(chǔ)包含內(nèi)存與磁盤兩個(gè)部分;
  • 內(nèi)存緩沖池(buffer pool)以頁(yè)為單位,緩存最熱的數(shù)據(jù)頁(yè)(data page)與索引頁(yè)(index page);
  • InnoDB以變種LRU算法管理緩沖池,并能夠解決“預(yù)讀失效”與“緩沖池污染”的問題;

如果寫請(qǐng)求到來(lái),會(huì)發(fā)生什么呢?

情況一

假如要修改頁(yè)號(hào)為4的索引頁(yè),而這個(gè)頁(yè)正好在緩沖池內(nèi)。

如上圖序號(hào)1-2:

  • 直接修改緩沖池中的頁(yè),一次內(nèi)存操作;
  • 寫入redo log,一次磁盤順序?qū)懖僮鳎?/li>

這樣的效率是最高的。

畫外音:像寫日志這種順序?qū)?,每秒幾萬(wàn)次沒問題。

是否會(huì)出現(xiàn)一致性問題呢?

并不會(huì)。

  • 讀取,會(huì)命中緩沖池的頁(yè);
  • 緩沖池LRU數(shù)據(jù)淘汰,會(huì)將“臟頁(yè)”刷回磁盤;
  • 數(shù)據(jù)庫(kù)異常崩潰,能夠從redo log中恢復(fù)數(shù)據(jù);

什么時(shí)候緩沖池中的頁(yè),會(huì)刷到磁盤上呢?

定期刷磁盤,而不是每次刷磁盤,能夠降低磁盤IO,提升MySQL的性能。

畫外音:批量寫,是常見的優(yōu)化手段。

情況二

假如要修改頁(yè)號(hào)為40的索引頁(yè),而這個(gè)頁(yè)正好不在緩沖池內(nèi)。

此時(shí)麻煩一點(diǎn),如上圖需要1-3:

  • 先把需要為40的索引頁(yè),從磁盤加載到緩沖池,一次磁盤隨機(jī)讀操作;
  • 修改緩沖池中的頁(yè),一次內(nèi)存操作;
  • 寫入redo log,一次磁盤順序?qū)懖僮鳎?/li>

沒有命中緩沖池的時(shí)候,至少產(chǎn)生一次磁盤IO,對(duì)于寫多讀少的業(yè)務(wù)場(chǎng)景,是否還有優(yōu)化的空間呢?

這即是InnoDB考慮的問題,又是本文將要討論的寫緩沖(change buffer)。

畫外音:從名字容易看出,寫緩沖是降低磁盤IO,提升數(shù)據(jù)庫(kù)寫性能的一種機(jī)制。

什么是InnoDB的寫緩沖?

在MySQL5.5之前,叫插入緩沖(insert buffer),只針對(duì)insert做了優(yōu)化;現(xiàn)在對(duì)delete和update也有效,叫做寫緩沖(change buffer)。

它是一種應(yīng)用在非唯一普通索引頁(yè)(non-unique secondary index page)不在緩沖池中,對(duì)頁(yè)進(jìn)行了寫操作,并不會(huì)立刻將磁盤頁(yè)加載到緩沖池,而僅僅記錄緩沖變更(buffer changes),等未來(lái)數(shù)據(jù)被讀取時(shí),再將數(shù)據(jù)合并(merge)恢復(fù)到緩沖池中的技術(shù)。寫緩沖的目的是降低寫操作的磁盤IO,提升數(shù)據(jù)庫(kù)性能。

畫外音:R了狗了,這個(gè)句子,好長(zhǎng)。

InnoDB加入寫緩沖優(yōu)化,上文“情況二”流程會(huì)有什么變化?

假如要修改頁(yè)號(hào)為40的索引頁(yè),而這個(gè)頁(yè)正好不在緩沖池內(nèi)。

加入寫緩沖優(yōu)化后,流程優(yōu)化為:

  • 在寫緩沖中記錄這個(gè)操作,一次內(nèi)存操作;
  • 寫入redo log,一次磁盤順序?qū)懖僮鳎?/li>

其性能與,這個(gè)索引頁(yè)在緩沖池中,相近。

畫外音:可以看到,40這一頁(yè),并沒有加載到緩沖池中。

是否會(huì)出現(xiàn)一致性問題呢?

也不會(huì)。

  • 數(shù)據(jù)庫(kù)異常崩潰,能夠從redo log中恢復(fù)數(shù)據(jù);
  • 寫緩沖不只是一個(gè)內(nèi)存結(jié)構(gòu),它也會(huì)被定期刷盤到寫緩沖系統(tǒng)表空間;
  • 數(shù)據(jù)讀取時(shí),有另外的流程,將數(shù)據(jù)合并到緩沖池;

不妨設(shè),稍后的一個(gè)時(shí)間,有請(qǐng)求查詢索引頁(yè)40的數(shù)據(jù)。

此時(shí)的流程如序號(hào)1-3:

  • 載入索引頁(yè),緩沖池未命中,這次磁盤IO不可避免;
  • 從寫緩沖讀取相關(guān)信息;
  • 恢復(fù)索引頁(yè),放到緩沖池LRU里;

畫外音:可以看到,40這一頁(yè),在真正被讀取時(shí),才會(huì)被加載到緩沖池中。

還有一個(gè)遺漏問題,為什么寫緩沖優(yōu)化,僅適用于非唯一普通索引頁(yè)呢?

InnoDB里,聚集索引(clustered index)和普通索引(secondary index)的異同,之前寫過(guò),不再展開。

如果索引設(shè)置了唯一(unique)屬性,在進(jìn)行修改操作時(shí),InnoDB必須進(jìn)行唯一性檢查。也就是說(shuō),索引頁(yè)即使不在緩沖池,磁盤上的頁(yè)讀取無(wú)法避免(否則怎么校驗(yàn)是否唯一?),此時(shí)就應(yīng)該直接把相應(yīng)的頁(yè)放入緩沖池再進(jìn)行修改,而不應(yīng)該再整寫緩沖這個(gè)幺蛾子。

除了數(shù)據(jù)頁(yè)被訪問,還有哪些場(chǎng)景會(huì)觸發(fā)刷寫緩沖中的數(shù)據(jù)呢?

還有這么幾種情況,會(huì)刷寫緩沖中的數(shù)據(jù):

  • 有一個(gè)后臺(tái)線程,會(huì)認(rèn)為數(shù)據(jù)庫(kù)空閑時(shí);
  • 數(shù)據(jù)庫(kù)緩沖池不夠用時(shí);
  • 數(shù)據(jù)庫(kù)正常關(guān)閉時(shí);
  • redo log寫滿時(shí);

畫外音:幾乎不會(huì)出現(xiàn)redo log寫滿,此時(shí)整個(gè)數(shù)據(jù)庫(kù)處于無(wú)法寫入的不可用狀態(tài)。

什么業(yè)務(wù)場(chǎng)景,適合開啟InnoDB的寫緩沖機(jī)制?

先說(shuō)什么時(shí)候不適合,如上文分析,當(dāng):

  • 數(shù)據(jù)庫(kù)都是唯一索引;
  • 或者,寫入一個(gè)數(shù)據(jù)后,會(huì)立刻讀取它;

這兩類場(chǎng)景,在寫操作進(jìn)行時(shí)(進(jìn)行后),本來(lái)就要進(jìn)行進(jìn)行頁(yè)讀取,本來(lái)相應(yīng)頁(yè)面就要入緩沖池,此時(shí)寫緩存反倒成了負(fù)擔(dān),增加了復(fù)雜度。

什么時(shí)候適合使用寫緩沖,如果:

  • 數(shù)據(jù)庫(kù)大部分是非唯一索引;
  • 業(yè)務(wù)是寫多讀少,或者不是寫后立刻讀??;

可以使用寫緩沖,將原本每次寫入都需要進(jìn)行磁盤IO的SQL,優(yōu)化定期批量寫磁盤。

畫外音:例如,賬單流水業(yè)務(wù)。

上述原理,對(duì)應(yīng)InnoDB里哪些參數(shù)?

有兩個(gè)比較重要的參數(shù)。

(1) 參數(shù):innodb_change_buffer_max_size

介紹:配置寫緩沖的大小,占整個(gè)緩沖池的比例,默認(rèn)值是25%,最大值是50%。

畫外音:寫多讀少的業(yè)務(wù),才需要調(diào)大這個(gè)值,讀多寫少的業(yè)務(wù),25%其實(shí)也多了。

(2) 參數(shù):innodb_change_buffering

介紹:配置哪些寫操作啟用寫緩沖,可以設(shè)置成all/none/inserts/deletes等。

寫緩沖,你學(xué)廢了嗎?

知其然,知其所以然。

思路比結(jié)論更重要。

責(zé)任編輯:趙寧寧 來(lái)源: 架構(gòu)師之路
相關(guān)推薦

2025-10-30 08:00:00

2025-10-30 07:06:00

內(nèi)存管理架構(gòu)memcache

2025-10-31 07:05:00

MQ平滑遷移MySQL

2022-03-30 09:23:15

MySQL緩沖

2019-06-26 06:31:56

緩沖緩沖池查詢數(shù)據(jù)

2021-02-25 11:30:17

代碼開發(fā)技術(shù)

2022-03-27 22:07:35

元宇宙虛擬人IBM

2025-02-20 10:04:35

2015-03-16 11:33:16

程序員代碼bug

2017-02-08 19:49:03

內(nèi)存SSDDRAM

2021-07-07 06:54:37

網(wǎng)頁(yè)Selenium瀏覽器

2020-09-15 09:55:13

架構(gòu)師架構(gòu)選型

2019-12-26 09:56:34

Java多線程內(nèi)部鎖

2023-05-16 07:15:11

架構(gòu)模型對(duì)象

2019-07-05 16:05:29

機(jī)器人AI人工智能

2020-08-05 14:39:49

交換機(jī)攻擊交換機(jī)安全

2021-04-20 09:55:37

Linux 開源操作系統(tǒng)

2020-09-27 06:50:56

Java互聯(lián)網(wǎng)注解

2014-12-11 10:01:09

程序員

2010-10-26 11:05:27

霍金
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)