新聞中心
前言事情是這樣的,在某乎的邀請(qǐng)回答中看到了這個(gè)問(wèn)題:

焦作網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、響應(yīng)式網(wǎng)站設(shè)計(jì)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)建站于2013年開(kāi)始到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專(zhuān)注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站。
-
然后當(dāng)時(shí)我沒(méi)多想就啪一下寫(xiě)下來(lái)這樣的答案:
這個(gè)其實(shí)要通過(guò) MySQL 后臺(tái)線程來(lái)刷的,在 Buffer Pool 中被修改的過(guò)的 Page(頁(yè))都會(huì)被標(biāo)記成臟頁(yè),放到一個(gè)鏈表(Flush 鏈表)里。
然后 MySQL 通過(guò)啟動(dòng)后臺(tái)線程,在滿足條件時(shí)將 Flush 鏈表中的臟頁(yè)刷入磁盤(pán)。
滿足的條件是:臟頁(yè)的數(shù)量達(dá)到了 Buffer Pool 中頁(yè)數(shù)量的 **10%,當(dāng)然 10% 這個(gè)值是可變的,通過(guò)配置項(xiàng) innodb_max_dirty_pages_pct_lwm 來(lái)配置的,其默認(rèn)值為 10%,并且這個(gè)值也必須小于另一個(gè)配置 innodb_max_dirty_pages_pct 的值(90%**)。
至于啟多少個(gè)線程,則是由另一個(gè)變量 innodb_page_cleaners 來(lái)控制的,默認(rèn)是 4.一般都不會(huì)去改這個(gè)。
大概就是這樣。
但是,后面有兄弟在下面說(shuō):”我唔知你喺講乜“。
后面我回過(guò)頭去看,當(dāng)時(shí)寫(xiě)的確實(shí)有點(diǎn)過(guò)于跳躍了,過(guò)一段時(shí)間再去看有些不是那么連貫,打算重新把這個(gè)事情講清楚。
1. 表數(shù)據(jù)
我們這篇「短文」討論的是【MySQL 表數(shù)據(jù)多久刷一次盤(pán)】,從這個(gè)標(biāo)題中我們可以分裂成兩個(gè)問(wèn)題:
- 刷什么到磁盤(pán)
- 什么時(shí)候刷到磁盤(pán)
我們分開(kāi)來(lái)討論。
2. 刷什么到磁盤(pán)
看上去有點(diǎn)廢話,肯定是將數(shù)據(jù)刷入磁盤(pán)。所以我們更多需要討論的是【數(shù)據(jù)是以什么樣的形式被刷入磁盤(pán)】。
在 InnoDB 中,頁(yè)是數(shù)據(jù)被管理的最小的單位。當(dāng)使用 InnoDB 作為存儲(chǔ)引擎的 MySQL 運(yùn)行時(shí),表中一行一行的數(shù)據(jù)會(huì)被組織在一頁(yè)一頁(yè)當(dāng)中,放在 Buffer Pool 中。
這一頁(yè)一頁(yè)的數(shù)據(jù),就存放在 Buffer Pool 中。當(dāng) DML 語(yǔ)句(也就是 CRUD)語(yǔ)句對(duì)表數(shù)據(jù)進(jìn)行了變更之后,數(shù)據(jù)所在的那一頁(yè)就會(huì)被標(biāo)記為臟頁(yè)。
InnoDB 會(huì)用一個(gè)叫【Flush 鏈表】的結(jié)構(gòu)來(lái)存放這些臟頁(yè),凡是被放進(jìn)該鏈表的頁(yè)都代表需要刷入磁盤(pán),但不是立即刷入。
和 InnoDB 的其他日志例如 Redo Log 一樣,這些日志都是有自己的刷盤(pán)策略。例如 Redo Log,其刷盤(pán)策略可以用下圖來(lái)表示:
參數(shù)為0,Redo Log 會(huì)每隔一秒,寫(xiě)入并且刷入磁盤(pán)。
參數(shù)為1,Redo Log 會(huì)在每次事務(wù)提交之后刷入磁盤(pán)。
參數(shù)為2,每次事務(wù)提交,都會(huì)寫(xiě)到 OS 緩存中去,然后每隔一秒將 OS 緩存中的數(shù)據(jù)刷入磁盤(pán)。
而 Flush 鏈表也有自己的策略。
3. 什么時(shí)候刷到磁盤(pán)
接上節(jié),策略就是:臟頁(yè)的數(shù)量達(dá)到了 Buffer Pool 中頁(yè)數(shù)量的 **10%**,就會(huì)觸發(fā)將 Flush 鏈表中的臟頁(yè)刷入磁盤(pán)。舉個(gè)例子,Buffer Pool 中總共有 100 張頁(yè),臟頁(yè)如果達(dá)到了 10 頁(yè)就會(huì)啟動(dòng)后臺(tái)線程,觸發(fā)刷盤(pán)。
當(dāng)然,【10%】這個(gè)數(shù)值是可配置的,通過(guò) MySQL 配置項(xiàng) innodb_max_dirty_pages_pct_lwm 可以進(jìn)行調(diào)整,只是默認(rèn)值是 10%。但是我們調(diào)整的值不能超過(guò)某個(gè)最大值,這個(gè)最大值由 innodb_max_dirty_pages_pct 來(lái)指定,默認(rèn)值為 90%。
換句話說(shuō),默認(rèn)情況,刷盤(pán)閾值是 10%,如果需要自定義,則最大值不能超過(guò) 90%。
4. 誰(shuí)來(lái)負(fù)責(zé)刷盤(pán)
上個(gè)小節(jié)已經(jīng)說(shuō)過(guò)了,會(huì)啟動(dòng)線程來(lái)專(zhuān)門(mén)做這個(gè)事情,這個(gè)沒(méi)有什么疑問(wèn)。我們需要關(guān)注的是會(huì)啟動(dòng)多少個(gè)線程來(lái)做這個(gè)事。
答案是 4 個(gè),我們也可以通過(guò)配置項(xiàng) innodb_page_cleaners 來(lái)更改,但一般都不會(huì)去改這個(gè)值。
關(guān)于這個(gè)點(diǎn)就聊到這。
文章題目:MySQL表數(shù)據(jù)多久刷一次盤(pán)?
文章起源:http://www.5511xx.com/article/dpjhjdi.html


咨詢
建站咨詢
