InnoDB 在處理更新語句的時(shí)候猾封,只做了寫日志這一個(gè)磁盤操作澄耍。
這個(gè)日志叫作 redo log(重做日志)
1.更新內(nèi)存
- redo log 后
就返回給客戶端,就是更新成功晌缘。
內(nèi)存數(shù)據(jù)頁(yè)跟磁盤數(shù)據(jù)頁(yè)內(nèi)容不一致的時(shí)候齐莲,我們稱這個(gè)內(nèi)存頁(yè)為 臟頁(yè) 。
刷臟頁(yè)(flush):內(nèi)存數(shù)據(jù)寫入到磁盤(flush )后枚钓,內(nèi)存和磁盤上的數(shù)據(jù)頁(yè)的內(nèi)容就一致了
臟頁(yè)變?yōu)?strong>干凈頁(yè)铅搓。
flush的觸發(fā):
- 的 redo log 寫滿了
出現(xiàn)這種情況的時(shí)候,整個(gè)系統(tǒng)就不能再接受更新了搀捷,所有的更新都必須堵住星掰。如果你從監(jiān)控上看,這時(shí)候更新數(shù)會(huì)跌為 0嫩舟。
- 的 redo log 寫滿了
- 系統(tǒng)內(nèi)存不足 .當(dāng)需要新的內(nèi)存頁(yè)氢烘,而內(nèi)存不夠用的時(shí)候,就要淘汰一些數(shù)據(jù)頁(yè)家厌,空出內(nèi)存給別的數(shù)據(jù)頁(yè)使用播玖。如果淘汰的是“臟頁(yè)”,就要先將臟頁(yè)寫到磁盤饭于。
- 空閑
- 正常關(guān)閉
2是常態(tài)蜀踏。InnoDB 用緩沖池(buffer pool)管理內(nèi)存,緩沖池中的內(nèi)存頁(yè)有三種狀態(tài):
第一種是掰吕,還沒有使用的果覆;
第二種是,干凈頁(yè)殖熟;
第三種是局待,臟頁(yè)。
InnoDB 的策略是盡量使用內(nèi)存菱属,因此對(duì)于一個(gè)長(zhǎng)時(shí)間運(yùn)行的庫(kù)來說钳榨,未被使用的頁(yè)面很少。
而當(dāng)要讀入的數(shù)據(jù)頁(yè)沒有在內(nèi)存的時(shí)候纽门,就必須到緩沖池中申請(qǐng)一個(gè)數(shù)據(jù)頁(yè)薛耻。
這時(shí)候只能把最久不使用的數(shù)據(jù)頁(yè)從內(nèi)存中淘汰掉:
如果要淘汰的是一個(gè)干凈頁(yè),就直接釋放出來復(fù)用赏陵;
如果是臟頁(yè)呢昭卓,就必須將臟頁(yè)先刷到磁盤愤钾,變成干凈頁(yè)后才能復(fù)用瘟滨。
刷臟頁(yè)雖然是常態(tài)候醒,但是出現(xiàn)以下這兩種情況,都是會(huì)明顯影響性能的:
要淘汰的臟頁(yè)個(gè)數(shù)太多
日志寫滿杂瘸,更新全部堵住倒淫,寫性能跌為 0,這種情況對(duì)敏感業(yè)務(wù)來說败玉,是不能接受的敌土。
所以,InnoDB 需要有控制臟頁(yè)比例的機(jī)制运翼,來盡量避免上面的這兩種情況返干。