Mysql innodb是如何刷新臟頁的痊远,innodb的策略是盡量使用內(nèi)存,假設(shè)我們給的innodb 內(nèi)存是1g,當(dāng)一個請求到達(dá)mysql 時骤星,這時候innodb 就會把最久不使用的數(shù)據(jù)頁釋放掉,供給新的請求使用爆哑,如果這個被釋放的頁原本就是干凈的洞难,直接使用。如果這是一個臟頁揭朝,就必須把臟頁刷新到磁盤队贱,然后才能使用。
相關(guān)參數(shù):
Innodb_io_capacity? 磁盤的io能力潭袱, 可以通過fio測試磁盤的iops柱嫌,這個值就是磁盤的io能力,建議innodb_io_capacity 參數(shù)=iops
但是mysql并不是全力按照上面的參數(shù)進(jìn)行刷新臟頁屯换,刷新速度受到兩個因素影響编丘,一個是臟頁比例,一個是redo log 寫盤速度彤悔。
參數(shù)innodb_max_dirty_pages_pct?臟頁比例上線 默認(rèn)75% 我認(rèn)為一般不用改嘉抓。
下面語句可以得到當(dāng)前的臟頁的比例。
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 來控制杨赤,這個參數(shù)對機性硬盤來說很有效敞斋,可以減少隨機io,增加性能疾牲。如果是ssd類磁盤植捎,建議設(shè)置為0,可以更快的刷新臟頁说敏。Mysql8.0中鸥跟,這個參數(shù)已經(jīng)默認(rèn)為0了。
如何看到到底由多少臟頁沒有刷新呢盔沫。
Show engine innodb status\G
找到log 部分
Checkpoint lsn 就是 和lsn 之間的差就是臟頁医咨,只有之間相差不是太大,認(rèn)為就是沒有問題架诞,如果很大的話拟淮,說明很多臟頁沒有刷新到磁盤,此時肯定會影響mysql性能谴忧,需要注意很泊。