mysql innodb flus_MySQL参数解析innodb_flush_neighbors
取值范圍:0,1,2
默認值:5.7版本為1, 8.0版本為0
含義:
設置為0時,表示刷臟頁時不刷其附近的臟頁。
設置為1時,表示刷臟頁時連帶其附近毗連的臟頁一起刷掉。
設置為2時,表示刷臟頁時連帶其附近區域的臟頁一起刷掉。1與2的區別是2刷的區域更大一些。
如果MySQL服務器磁盤是傳統的HDD存儲設備,打開該參數,能夠減少I/O磁盤尋道的開銷,提高性能,而對于SSD設備,尋道時間的性能影響很小,關閉該參數,反而能夠分散寫操作,提高數據庫性能。由于SSD設備的普及,MySQL 8.0 將該參數的默認值由1調整為0。
innodb_flush_neighbors參數源碼分析:
源碼版本:5.7.19
在源碼中,innodb_flush_neighbors 參數對應的變量為srv_flush_neighbors,這是一個全局變量,默認值為1,如下:
ulong srv_flush_neighbors = 1;
整個代碼中,用到變量 srv_flush_neighbors 的地方只有一個,那就是函數 buf_flush_try_neighbors(),該函數位于源碼文件:storage/innobase/buf/buf0flu.cc
buf_flush_try_neighbors() 函數主要邏輯,如下:
static ulint buf_flush_try_neighbors(
const page_id_t&??page_id,
buf_flush_t???????flush_type,
ulint?????????????n_flushed,
ulint?????????????n_to_flush)
{
if (UT_LIST_GET_LEN(buf_pool->LRU) < BUF_LRU_OLD_MIN_LEN
|| srv_flush_neighbors == 0) {
// [low, high] 區間不包含鄰近的頁面
low = page_id.page_no();
high = page_id.page_no() + 1;
}else{
// [low, high] 區間包含鄰近的頁面
low = (page_id.page_no() / buf_flush_area) * buf_flush_area;
high = (page_id.page_no() / buf_flush_area + 1) * buf_flush_area;
if (srv_flush_neighbors == 1) {
...
// 根據 [low, high] 區間內的頁是否可以刷盤,來進一步縮小 [low, high] 區間
}
}
...
// 根據 [low, high] 區間進行臟頁刷盤
}
buf_flush_try_neighbors() 函數根據 [low, high] 區間來刷臟頁。
當 srv_flush_neighbors 為 0時, [low, high] 只包含一個頁面。
當 srv_flush_neighbors 為 1時, [low, high] 包含鄰近的頁面,頁面數小于等于變量值buf_flush_area。
當 srv_flush_neighbors 為 2時, [low, high] 包含鄰近的頁面,頁面數等于變量值buf_flush_area。
總結
以上是生活随笔為你收集整理的mysql innodb flus_MySQL参数解析innodb_flush_neighbors的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人参根须的功效与作用、禁忌和食用方法
- 下一篇: 双通道和单通道区别_实测内存通道的区别: