innodb buffer pool相關特性

2022-03-26 05:22:58 字數 2674 閱讀 2124

innodb buffer pool作為innodb最重要的快取,其快取命中率的高低會直接影響資料庫的效能。因此在資料庫發生變更,比如重啟、主備切換例項遷移等等,innodb buffer poll 需要一段時間預熱,期間資料庫的效能會受到明顯影響。

另外mysql 5.7以前innodb buffer pool快取大小修改不是動態的,重啟才能生效。因此innodb buffer pool的預熱和innodb buffer pool大小的動態修改,對效能要求較高的應用來說是不錯的特性,下面我來看看這兩個特性的具體實現。

mysql 5.6以後支援buffer pool預熱功能。引入了以下引數, 引數具體含義參見官方文件

innodb_buffer_pool_load_now

innodb_buffer_pool_dump_now

innodb_buffer_pool_load_at_startup

innodb_buffer_pool_dump_at_startup

innodb_buffer_pool_filename

buffer pool預熱分為dump過程和load過程,均由後台執行緒buf_dump_thread完成。

比如使用者發起set命令

set global innodb_buffer_pool_load_now=on;

set 命令會立刻返回,具體操作由buf_dump_thread來實現。

dump過程一般比較快,而load過程相對要慢些。

通過innodb_buffer_pool_dump_statusinnodb_buffer_pool_load_status可檢視dump/load的狀態

另外5.7引入了performance_schema.events_stages_current來顯示load進度,每load 32m會更新一條進度資訊

select * from performance_schema.events_stages_current;

thread_id 19

event_id 1367

end_event_id null

event_name stage/innodb/buffer pool load

source buf0dump.cc:619

timer_start 33393877311000

timer_end 33398961258000

timer_wait 5083947000

work_completed 0

work_estimated 1440

nesting_event_id null

nesting_event_type null

work_estimated表示總page數

work_completed表示當前已load page數

dump檔案的資料格式如下

#cat ib_buffer_pool |more

0,70,1

0,30,2

0,40,11

0,50,6

dump檔案比較簡單,我們可以編輯此檔案來預載入指定page,比較靈活。

5.7 開始支援buffer pool 動態調整大小,每個buffer_pool_instance都由同樣個數的chunk組成(chunks陣列), 每個chunk記憶體大小為innodb_buffer_pool_chunk_size(實際會偏大5%,用於存放chuck中的block資訊)。buffer pool以innodb_buffer_pool_chunk_size為單位進行動態增大和縮小。調整前後innodb_buffer_pool_size應一直保持是innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances的倍數。

同樣的buffer pool動態調整大小由後台執行緒buf_resize_thread,set命令會立即返回。通過innodb_buffer_pool_resize_status可以檢視調整的執行狀態。

由上可以看出,擴大記憶體比縮小記憶體相對容易些。縮小記憶體時,如果遇到有事務一直未提交且占用了待收縮的page時,導致收縮一直重試,error log會列印這種重試資訊,

包含可能引用此問題的事務資訊。為了避免頻繁重試,每次重試的時間間隔會指數增長。

以上步驟中resize階段buffer pool會不可用,此階段會鎖所有buffer pool, 但此階段都是記憶體操作,時間比較短。收縮記憶體階段耗時可能會很長,也有一定影響,但是每次都是以instance為單位進行鎖定的。

總的來說,buffer pool 動態調整大小對應用的影響並不大。

buffer pool 預熱 和buffer pool 動態調整大小,這兩功能相輔相承的。buffer pool 動態調整大小只適用於例項在主機本地公升級的情況,如果使用者修改buffer pool大小,同時涉及跨機遷移,那麼buffer pool 預熱功能就排上用場了。

另外buffer pool 動態調整盡量在業務低鋒時進行。

快速預熱innodb buffer pool

早期,peter在實際的工作中總結了一些預熱buffer pool的sql語句,也就是通過人為模擬一些請求,盡可能地將我們所需的資料塊和索引載入到記憶體中。1.載入主鍵索引 select count from tbl where no index col 0 2.載入非主鍵索引 select cou...

特基礎特基礎的東西隨便寫寫

include include include using namespace std 定義人類 person 資料成員 m strname 成員函式 attack class person 定義士兵類 soldier 士兵類公有繼承人類 資料成員 m strname 成員函式 attack cla...

斯特林數 斯特林反演

第一類stirling數 s n,m 也可記為 beginn m end 第一類stirling分為無符號第一類stirling數 s u n,m 和帶符號第一類stirling數 s s n,m 他們分別表現為其公升階函式和降階函式的各項係數,形式如下 x x cdot x 1 cdot x 2 ...