新聞中心
本文轉(zhuǎn)載自微信公眾號「yes的練級攻略」,作者yes的練級攻略 。轉(zhuǎn)載本文請聯(lián)yes的練級攻略公眾號。

成都創(chuàng)新互聯(lián)公司長期為成百上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為隰縣企業(yè)提供專業(yè)的網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì),隰縣網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
你好,我是yes。
有位同學(xué)問了我兩個(gè)關(guān)于 change buffer 的問題:
隨后我又挑了幾個(gè)問答的用戶提問這兩個(gè)問題,發(fā)現(xiàn)對 change buffer 的理解都有偏差,于是決定操作一篇。
之前我寫過一篇關(guān)于 mysql innodb 所有 buffer 的內(nèi)容 :總結(jié) mysql 的所有 buffer,一網(wǎng)打盡就這篇了!
里面有提到 change buffer,這篇算是之前那篇的補(bǔ)充吧。
如果對 mysql innodb buffer 不太熟悉,建議先看下我之前總結(jié)的內(nèi)容,這個(gè)還是需要點(diǎn)前置知識的。
簡單回顧 change buffer
簡單來說 change buffer 就是一塊內(nèi)存,存在于 buffer pool 中,當(dāng)需要修改數(shù)據(jù)時(shí)候,如果這個(gè)數(shù)據(jù)所在頁在 buffer pool,那么萬事大吉,直接在內(nèi)存也修改。
那假設(shè) buffer pool 里沒有要修改的那個(gè)數(shù)據(jù)頁,這時(shí)候該修改怎么辦呢?
假設(shè)要執(zhí)行這個(gè) sql:update table set a= 'yes' where b = 1
第一直覺就是找到 b =1 的數(shù)據(jù)所在的數(shù)據(jù)頁,加載到 buffer pool 中,然后進(jìn)行修改,這里就涉及了從磁盤拉取數(shù)據(jù)到內(nèi)存這個(gè)動(dòng)作,我們都知道讀盤的開銷是比較大的。
所以 mysql innodb 搞了個(gè) change buffer,當(dāng)數(shù)據(jù)頁不存在 buffer pool 時(shí),mysql innodb 先把更新動(dòng)作緩存在 change buffer 中,當(dāng)下次 select b=1 這個(gè)數(shù)據(jù)的時(shí)候,將數(shù)據(jù)加載到 buffer pool 中,同時(shí)應(yīng)用上 change buffer 的修改,這就得到正確的數(shù)據(jù)了。
圖來自mysql官網(wǎng)
重點(diǎn)
上述的原理不難理解,不過我之前文章提到了一點(diǎn):
這就是重點(diǎn),理解了這個(gè)就能解答上面那位同學(xué)的提問。
change buffer 只能應(yīng)用非唯一二級索引
聚蔟索引和唯一索引都需要檢查數(shù)據(jù)的一致性,這就不好先把更新、插入、刪除先緩存在 change buffer 中。
假設(shè)現(xiàn)在有一張名為 yes 表,里面有聚蔟索引以及一個(gè)(a,b) 的非唯一二級索引,現(xiàn)要執(zhí)行如下語句:
update yes set b= 'yes的練級攻略' where a = 'yesyes'
思考下,此時(shí)能用上 change buffer 嗎?
原則上這條更新語句,mysql 可以選擇聚蔟索引掃,或者應(yīng)用 (a,b)這個(gè)索引。
假設(shè)走(a,b)索引。
那問題來了,要走(a,b)索引,不就是要掃描(a,b)的數(shù)據(jù)嗎,也就是需加載(a,b)索引數(shù)據(jù)頁到 buffer pool 中,那還用啥 change buffer?
聽起來 change buffer 好像沒啥用?。?/p>
我再加點(diǎn)條件:假設(shè)這個(gè)表不僅僅有 (a,b)這個(gè)索引,還有(c,b)、(d,b)等等這些索引,那么如果我們要修改 b 字段的值,是不是除了聚蔟索引,還需要修改(c,b)、(d,b)等等這些索引?
那 change buffer 的用處就來了!我們可以緩存這些修改,后面再應(yīng)用,這就大量減少了此次 sql 的隨機(jī)磁盤 I/O,提高了性能。
看到這,相信你對 change buffer 應(yīng)該已經(jīng)有點(diǎn)感覺了,你可以借著這些感覺,去看下官網(wǎng)的介紹,理解起來更容易:
https://dev.mysql.com/doc/refman/5.7/en/innodb-change-buffer.html
回答問題
第一個(gè)問題:insert 用 chang buffer 如何確定主鍵不沖突?
主鍵索引和唯一索引都需要掃描校驗(yàn),change buffer 只會(huì)緩存那些非唯一二級索引的插入操作。
第二個(gè)問題:用 chang buffer 不訪問磁盤,如何得到實(shí)際修改行數(shù)?
chang buffer 無法應(yīng)用在主鍵索引(聚蔟索引)和唯一二級索引上,所以這兩個(gè)得改,主鍵索引都改了,影響行數(shù)就有了。
分享題目:問了幾人,MySQLchangebuffer這點(diǎn)都沒答對
當(dāng)前URL:http://www.dlmjj.cn/article/ccojcdi.html


咨詢
建站咨詢
