MySQL之change buffer和buffer pool


2020年第一篇, 比預計的時間延遲半個月, 突如其來的疫情讓人不知所措, 應該沒有哪個春節像今年一樣了吧, 但願疫情能夠盡快過去, 一切早日恢復正常!

重新整理和復習MySQL相關知識, 其實主要是重新看之前記錄的思維導圖, 然后通過<<MySQL實戰45講>>和<<架構師之路>>來補充和溫習, 所以以下很多都以截圖的形式放上來了.

buffer pool

InnoDB的緩沖池緩存什么?有什么用?
緩存表數據與索引數據,把磁盤上的數據加載到緩沖池,避免每次訪問都進行磁盤IO,起到加速訪問的作用

總結:

  1. 緩沖池(buffer pool)是一種常見的降低磁盤訪問的機制;
  2. 緩沖池通常以頁(page)為單位緩存數據;
  3. 緩沖池的常見管理算法是LRU,memcache,OS,InnoDB都使用了這種算法;
  4. InnoDB對普通LRU進行了優化:
    • 將緩沖池分為老生代和新生代,入緩沖池的頁,優先進入老生代,頁被訪問,才進入新生代,以解決預讀失效的問題
    • 頁被訪問,且在老生代停留時間超過配置閾值的,才進入新生代,以解決批量數據訪問,大量熱數據淘汰的問題

change buffer

change buffer是InnoDB的寫緩沖, 目的是降低寫操作的磁盤IO
使用場景

  • 適合
    對於寫多讀少的業務來說,頁面在寫完以后馬上被訪問到的概率比較小,此時 change buffer 的使用效果最好。這種業務模型常見的就是賬單類、日志類的系統
  • 不適合
    假設一個業務的更新模式是寫入之后馬上會做查詢,那么即使滿足了條件,將更新先記錄在 change buffer,但之后由於馬上要訪問這個數據頁,會立即觸發 merge 過程。這樣隨機訪問 IO 的次數不會減少,反而增加了 change buffer 的維護代價。所以,對於這種業務模式來說,change buffer 反而起到了副作用

樣例

比如要修改頁號為40的索引頁

1.這個頁在buffer pool(緩沖池)

2.這個頁不在buffer pool(緩沖池)


以上步驟是

  1. 在change buffer中記錄這個操作, 一次內存操作
  2. 寫入redo log, 一次順序寫磁盤操作


注意以上讀取流程, 之前的操作記錄只是在change buffer中, buffer poll中並沒有, 所以需要從磁盤讀取, 然后再從change buffer中讀取做merge操作, 再放回去到buffer pool中

change buffer為什么唯一索引不能用?

針對更新操作

  • 唯一索引(不能使用)
    • 在內存: 直接判斷有沒有沖突, 沒有沖突直接更新到內存. 不使用change buuffer
    • 不在內存: 將數據頁讀入內存(需要從磁盤讀出數據來判斷),判斷到沒有沖突. 不使用change buffer
  • 普通索引(可以使用)
    • 在內存: 直接更新, 不使用change buffer
    • 不在內存: 直接將更新記錄在change buffer中結束. 使用 change buffer

相關資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM