問了幾人,MySQL changebuffer 這點都沒答對
你好,我是yes。
有位同學問了我兩個關於 change buffer 的問題:
隨後我又挑了幾個問答的使用者提問這兩個問題,發現對 change buffer 的理解都有偏差,於是決定操作一篇。
之前我寫過一篇關於 mysql innodb 所有 buffer 的內容 :總結 mysql 的所有 buffer,一網打盡就這篇了!
裡面有提到 change buffer,這篇算是之前那篇的補充吧。
如果對 mysql innodb buffer 不太熟悉,建議先看下我之前總結的內容,這個還是需要點前置知識的。
簡單回顧 change buffer
簡單來說 change buffer 就是一塊記憶體,存在於 buffer pool 中,當需要修改資料時候,如果這個資料所在頁在 buffer pool,那麼萬事大吉,直接在記憶體也修改。
那假設 buffer pool 裡沒有要修改的那個資料頁,這時候該修改怎麼辦呢?
假設要執行這個 sql:update table set a= 'yes' where b = 1
第一直覺就是找到 b =1 的資料所在的資料頁,載入到 buffer pool 中,然後進行修改,這裡就涉及了從磁碟拉取資料到記憶體這個動作,我們都知道讀盤的開銷是比較大的。
所以 mysql innodb 搞了個 change buffer,當資料頁不存在 buffer pool 時,mysql innodb 先把更新動作快取在 change buffer 中,當下次 select b=1 這個資料的時候,將資料載入到 buffer pool 中,同時應用上 change buffer 的修改,這就得到正確的資料了。
重點
上述的原理不難理解,不過我之前文章提到了一點:
這就是重點,理解了這個就能解答上面那位同學的提問。
change buffer 只能應用非唯一二級索引
聚蔟索引和唯一索引都需要檢查資料的一致性,這就不好先把更新、插入、刪除先快取在 change buffer 中。
假設現在有一張名為 yes 表,裡面有聚蔟索引以及一個(a,b) 的非唯一二級索引,現要執行如下語句:
update yes set b= 'yes的練級攻略' where a = 'yesyes'
思考下,此時能用上 change buffer 嗎?
原則上這條更新語句,mysql 可以選擇聚蔟索引掃,或者應用 (a,b)這個索引。
假設走(a,b)索引。
那問題來了,要走(a,b)索引,不就是要掃描(a,b)的資料嗎,也就是需載入(a,b)索引資料頁到 buffer pool 中,那還用啥 change buffer?
聽起來 change buffer 好像沒啥用啊?
我再加點條件:假設這個表不僅僅有 (a,b)這個索引,還有(c,b)、(d,b)等等這些索引,那麼如果我們要修改 b 欄位的值,是不是除了聚蔟索引,還需要修改(c,b)、(d,b)等等這些索引?
那 change buffer 的用處就來了!我們可以快取這些修改,後面再應用,這就大量減少了此次 sql 的隨機磁碟 I/O,提高了效能。
看到這,相信你對 change buffer 應該已經有點感覺了,你可以藉著這些感覺,去看下官網的介紹,理解起來更容易:
https://dev.mysql.com/doc/refman/5.7/en/innodb-change-buffer.html
回答問題
第一個問題:insert 用 chang buffer 如何確定主鍵不衝突?
主鍵索引和唯一索引都需要掃描校驗,change buffer 只會快取那些非唯一二級索引的插入操作。
第二個問題:用 chang buffer 不訪問磁碟,如何得到實際修改行數?
chang buffer 無法應用在主鍵索引(聚蔟索引)和唯一二級索引上,所以這兩個得改,主鍵索引都改了,影響行數就有了。
好了,今天的文章就到這了,如果有收穫不妨點給贊。
關於問答我還提供 1v1 個人問答服務,詳細可以看這裡:我的一對一專屬問答服務,簡單來說就是你有任何面試、技術上的問題都可以直接微信向我提問。
我是yes,從一點點到億點點我們下篇見~
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024923/viewspace-2937366/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 上週我面了個三年 Javaer,這幾個問題都沒答出來Java
- 面試時這麼問你Spring Boot,你能答對幾個?面試Spring Boot
- 聽說90%的人都答不對這道Python題Python
- 【譽天教育】這幾道linux基礎選擇題你答對了嗎?Linux
- 沒聽過地下網管檢測機器人?這就對了機器人
- 答案公佈 | AI衝頂大會你答對了幾道?AI
- 這都Java15了,Java7特性還沒整明白?Java
- 小心!電商平臺的假貨 都發給了這些人
- 10道網路安全基礎面試題,你答對了幾道?面試題
- 智慧問答機器人機器人
- 你能答對幾道SQL題?SQL
- MySQL的這個bug,坑了多少人?MySql
- 這些javascript面試題,你做對了幾道?JavaScript面試題
- Redis系列總結--這幾點你會了嗎?Redis
- 這個 SQL 問題絕對能讓你對 MySQL 的理解更進一步!目前公司還沒人想出解決方案MySql
- Python操作MySQL儲存,這些你都會了嗎?PythonMySql
- 分庫分表很常見,但這些問題90%的人都答不全
- 對CQRS架構的幾點疑問架構
- 炸了!程式設計師現在沒有這點技能都還不能就業了?(附資料,建議白嫖)程式設計師就業
- 給大家丟臉了,用了三年golang,我還是沒答對這道記憶體洩漏題Golang記憶體
- 搭建智慧問答機器人機器人
- 邦芒面試:這10個問題都答不上來,你還想透過面試?面試
- MYSQL 使用基礎 - 這麼用就對了MySql
- 操作熱點問答:醫療系統被攻擊了怎麼辦?
- 從一道沒人能答對的面試題聊聊Java的值傳遞面試題Java
- 看完這篇 HashSet,跟面試官扯皮沒問題了面試
- 這個連銷售人員都沒有的軟體公司,靠這5大策略獲得了成功
- 這些鮮為人知的前端冷知識,你都GET了嗎?前端
- 答讀者問:BeanFactoryPostProcessor 似乎失效了?Bean
- 我這節課都學了啥
- 看完這篇HTTP,跟面試官扯皮就沒問題了HTTP面試
- 板橋上文章上的疑惑:一個JAVABEAN的JNDI問題。問了幾個人了,都說不知道。JavaBean
- 使用者粘性好的網站都必須要做到這幾點網站
- 面試現場:這些常問的面試題你都會了嗎面試題
- 搞懂了這幾點,你就學會了Web程式設計Web程式設計
- 報表為什麼會沒完沒了?怎麼解決這個問題?
- 關於幾個MySQL環境問題的對比MySql
- 這個問題已經煩擾我幾個月了,我始終沒有找到答案。希望高手指點。