共計 1375 個字符,預計需要花費 4 分鐘才能閱讀完成。
自動寫代碼機器人,免費開通
丸趣 TV 小編給大家分享一下 MySQL Buffer pool 里的 change buffer 是什么,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
4 change buffer
4.1 基本概念
change buffer 是一種特殊的數據結構,當這些頁面不在緩沖池中時,這些高速緩存會將更改緩存到輔助索引頁面。可能由 INSERT,UPDATE 或 DELETE 操作(DML)導致的緩沖更改將在以后通過其他的讀取操作將頁加載到緩沖池中時合并。
相關免費學習推薦:mysql 視頻教程
如上圖可見,change buffer 用的是 buffer pool 里的內存,所以不能無限增長。change buffer 大小可通過參數 innodb_change_buffer_max_size 動態設置。
比如設置為 50:change buffer 的大小最多只能占用 buffer pool 的 50%。
需更新一個數據頁時:
頁在內存,直接更新
頁不在內存,在不影響數據一致性下,InooDB 會將這些更新操作緩存于 change buffer,而無需從磁盤讀入頁
在下次查詢訪問該數據頁時,才將數據頁讀入內存,然后執行 change buffer 中與這個頁有關的操作。通過該方式就能保證該數據邏輯的正確性。
change buffer 實際上也是可持久化的數據,即它不僅在內存中有拷貝,也會被寫進磁盤。
4.2 merge
將 change buffer 中的操作應用到原數據頁,得到最新結果的過程。
4.2.1 觸發時機
訪問該數據頁
系統后臺線程定期 merge
數據庫正常關閉(shutdown)的過程
若能將更新操作先記錄在 change buffer,減少讀盤,語句執行速度便會明顯提升。且數據讀入內存需要占用 buffer pool,因此也能降低內存占用,提高內存利用率。
4.3 何時使用 change buffer
對于唯一索引,更新操作都要先判斷該操作是否違反唯一性約束:
比如,要插入 (4,400) 記錄,要先判斷表中是否已存 k = 4 記錄,就必須要將數據頁讀入內存來判斷。若都已讀入內存了,那直接更新內存自然很快,沒必要使用 change buffer。
因此,唯一索引的更新不能使用 change buffer,只有普通索引可使用。
4.4 適用場景
難道普通索引的所有場景,使用 change buffer 都可加速嗎?
注意 merge 才是真正進行數據更新時刻,change buffer 主要是將記錄的變更動作緩存。所以在一個數據頁做 merge 前,change buffer 記錄變更越多(即該數據頁上要更新的次數越多),收益越大。
寫多讀少業務,頁面在寫完后馬上被訪問到的概率較小,change buffer 使用效果最好。常見為賬單、日志類系統。
寫后馬上查詢,將先新記錄在 change buffer,但之后由于立即訪問該數據頁,又很快觸發 merge,這樣的話隨機訪問 IO 次數不會減少,反而增加 change buffer 維護代價,change buffer 起了副作用。
以上是“MySQL Buffer pool 里的 change buffer 是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注丸趣 TV 行業資訊頻道!
向 AI 問一下細節