主要有四個原因:mysql的內(nèi)存滿了、redo log日志滿了、空閑時間、重啟數(shù)據(jù)庫。
一、分析以下四種原因?qū)π阅艿挠绊?/h4>
這種影響在實際線上環(huán)境主要是內(nèi)存和redo log 日志對性能的影響。
1.InnoDB用緩沖池(pool buffer)管理內(nèi)存,緩沖池中內(nèi)存頁有哪三種狀態(tài)?
(1)沒有使用
(2)使用了有臟內(nèi)存頁(臟內(nèi)存頁:內(nèi)存的數(shù)據(jù)和磁盤數(shù)據(jù)不一致的內(nèi)存頁)
(3)使用了是干凈頁
2.簡單說說在內(nèi)存滿了的時候會怎么處理?
當(dāng)內(nèi)存滿了時,如果內(nèi)存中有查詢的數(shù)據(jù)頁,就直接返回;沒有的話就要淘汰掉最久不使用的數(shù)據(jù)頁,被淘汰的數(shù)據(jù)頁如果是臟頁,還會把臟頁持久化的磁盤后,空出的內(nèi)存才能使用。
flush一個臟頁時是否使用連坐機制怎么設(shè)置?
innodb_flush_neighbors = 1 時會使用連坐機制,一般是機械磁盤使用,連坐意思就是當(dāng)有數(shù)據(jù)頁是臟頁需要持久化后,會判斷相鄰的數(shù)據(jù)頁是否為臟頁,持久化的操作會連續(xù)下去,直到?jīng)]有臟頁為止。
innodb_flush_neighbors = 0 時,不會觸發(fā)連坐機制,一般時ssd固態(tài)硬盤使用,因為IOPS(io每秒輸入輸出量)并不是瓶頸。
二、flush臟頁的策略
1.innodb_io_capacity
innodb_io_capacity是InnoDB刷臟頁的速度。
引擎怎么控速度的?
引擎怎么控速度主要需要考慮兩個因素:一是臟頁的比例,二是磁盤的io效率。
選出F1(N)和F2(M)的較大值記錄為R
flush速度 = innodb_io_capacity * R%
2.怎么得到臟頁比例和磁盤io?
innodb_max_dirty_pages_pct:是臟頁比例的上限,默認(rèn)值是75%。InnoDB會根據(jù)當(dāng)前臟頁的比例N,根據(jù)函數(shù)算法的得到F1(N);
innoDB 每次寫入的日志都有一個序號,當(dāng)前寫入的序號跟 checkpoint 對應(yīng)的序號之間的差值M,根據(jù)函數(shù)算法的得到F2(M);
三、思考題
一個內(nèi)存配置為 128GB、innodb_io_capacity 設(shè)置為 20000 的大規(guī)格實例,正常會建議你將 redo log 設(shè)置成 4 個 1GB 的文件。但如果你在配置的時候不慎將 redo log 設(shè)置成了 1 個 100M 的文件,會發(fā)生什么情況呢?又為什么會出現(xiàn)這樣的情況呢?