MySQL:change buffer

1. 概念

  Innodb維護了一個緩存區域叫作Buffer Pool,用來緩存數據和索引在內存中。其大小經過參數 innodb_buffer_pool_size 控制;數據庫

  change buffer 是 buffer pool 中的一部份內存;它既在內存中有拷貝,也能夠持久化到磁盤;其大小經過參數 innodb_change_buffer_max_size 控制,表示最多佔用 buffer pool的百分比;緩存

  當須要更新一個數據頁時,若是數據頁在內存中,則直接更新;不然,在不影響數據一致性的前提下,InnoDB 將這些操做緩存在 change buffer 中,這樣就沒必要從磁盤中讀取數據,當下次查詢須要訪問這個數據頁時,再將數據頁讀入內存,而後執行 change  buffer 中與這個頁有關的操做,最後將查詢結果返回。spa

  merge:將  change  buffer 的操做應用到數據頁的過程稱爲 merge。除了訪問數據頁會觸發 merge 外;系統後臺有線程會按期 merge;數據庫正常關閉的過程當中也會觸發 merge 操做。線程

  更新操做記錄到 change  buffer ,能夠減小讀磁盤,提升執行效率;並且讀入數據會佔用 buffer pool ,還能夠提升內存使用率。日誌

2. 使用條件

  對於惟一索引,全部更新操做都須要作惟一性約束的判斷,必須將數據頁讀入內存,直接在內存中更新,不使用 change  buffer 。索引

  對於普通索引,當數據頁在內存中時,直接進行更新操做便可;當數據頁不在內存中時,直接將更新操做寫入 change buffer 便可。內存

3. 使用場景

  change buffer 的主要做用就是將記錄的變動操做緩存下來,在 merge 以前, change buffer 記錄的越多,收益就越大。innodb

  適合頁面變動完以後被立刻訪問機率較小的場景。效率

  若是頁面變動以後又要被訪問,此時會當即觸發 merge 過程,這樣反而增長了 change buffer 的維護代價,多了一個寫 change buffer 的操做,此時關閉 change buffer 反而能提升效率;後臺

4. changer buffer 和 redo log

  change buffer 主要節省的是隨機讀磁盤的IO 消耗;

  redo log 主要是節省隨機寫磁盤的IO消耗;

  更新普通索引時:

    若是數據不在內存中,能夠直接將變動操做緩存到 change buffer,而不須要將數據讀入內存;若是沒有 change buffer,則必須將數據讀入內存,而後更新數據。此時節省了隨機讀磁盤的IO消耗;

    redo log 將數據變動操做記錄在日誌中,不用寫入磁盤便可返回執行結果;若是沒有 redo log,則更新完數據必須先將數據寫入磁盤,再返回執行結果。此時節省了隨機寫磁盤的IO消耗;

  查詢普通索引時:

    若是數據不在內存中,必須先將數據讀入磁盤,再執行 change buffer 中的相關操做,而後返回查詢結果。只有查詢數據時,才須要將數據讀磁盤到內存

相關文章
相關標籤/搜索