2020年第一篇, 比預計的時間延遲半個月, 突如其來的疫情讓人不知所措, 應該沒有哪個春節像今年一樣了吧, 但願疫情能夠盡快過去, 一切早日恢復正常!
重新整理和復習MySQL相關知識, 其實主要是重新看之前記錄的思維導圖, 然后通過<<MySQL實戰45講>>和<<架構師之路>>來補充和溫習, 所以以下很多都以截圖的形式放上來了.
buffer pool
InnoDB的緩沖池緩存什么?有什么用?
緩存表數據與索引數據,把磁盤上的數據加載到緩沖池,避免每次訪問都進行磁盤IO,起到加速訪問的作用
總結:
- 緩沖池(buffer pool)是一種常見的降低磁盤訪問的機制;
- 緩沖池通常以頁(page)為單位緩存數據;
- 緩沖池的常見管理算法是LRU,memcache,OS,InnoDB都使用了這種算法;
- 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(緩沖池)
中
以上步驟是
- 在change buffer中記錄這個操作, 一次內存操作
- 寫入redo log, 一次順序寫磁盤操作
注意以上讀取流程, 之前的操作記錄只是在change buffer中, buffer poll中並沒有, 所以需要從磁盤讀取, 然后再從change buffer中讀取做merge操作, 再放回去到buffer pool中
change buffer為什么唯一索引不能用?
針對更新操作
- 唯一索引(不能使用)
- 在內存: 直接判斷有沒有沖突, 沒有沖突直接更新到內存. 不使用change buuffer
- 不在內存: 將數據頁讀入內存(需要從磁盤讀出數據來判斷),判斷到沒有沖突. 不使用change buffer
- 普通索引(可以使用)
- 在內存: 直接更新, 不使用change buffer
- 不在內存: 直接將更新記錄在change buffer中結束. 使用 change buffer
相關資料
- <<架構師之路>>
- <<MySQL實戰45將>>
- 緩沖池(buffer pool),這次徹底懂了!!!
- 寫緩沖(change buffer),這次徹底懂了!!!
