Mysql innodb是如何刷新髒頁的,innodb的策略是儘量使用內存,假設我們給的innodb 內存是1g,當一個請求到達mysql 時,這時候innodb 就會把最久不使用的數據頁釋放掉,供給新的請求使用,如果這個被釋放的頁原本就是乾淨的,直接使用。如果這是一個髒頁,就必須把髒頁刷新到磁盤,然後才能使用。
相關參數:
Innodb_io_capacity 磁盤的io能力, 可以通過fio測試磁盤的iops,這個值就是磁盤的io能力,建議innodb_io_capacity 參數=iops
但是mysql並不是全力按照上面的參數進行刷新髒頁,刷新速度受到兩個因素影響,一個是髒頁比例,一個是redo log 寫盤速度。
參數innodb_max_dirty_pages_pct 髒頁比例上線 默認75% 我認爲一般不用改。
下面語句可以得到當前的髒頁的比例。
select VARIABLE_VALUE into @a fromglobal_status where VARIABLE_NAME = 'Innodb_buffer_pool_pages_dirty';
select VARIABLE_VALUE into @b fromglobal_status where VARIABLE_NAME = 'Innodb_buffer_pool_pages_total';
select @a/@b;
在刷新髒頁過程中,如果磁盤髒頁鄰近也是髒頁,會把這個鄰居也flush掉,這個行爲由innodb_flush_neighbors 來控制,這個參數對機性硬盤來說很有效,可以減少隨機io,增加性能。如果是ssd類磁盤,建議設置爲0,可以更快的刷新髒頁。Mysql8.0中,這個參數已經默認爲0了。
如何看到到底由多少髒頁沒有刷新呢。
Show engine innodb status\G
找到log 部分
Checkpoint lsn 就是 和lsn 之間的差就是髒頁,只有之間相差不是太大,認爲就是沒有問題,如果很大的話,說明很多髒頁沒有刷新到磁盤,此時肯定會影響mysql性能,需要注意。