mysql常見後臺執行緒
1.IO THREAD
MySQL有很多後臺執行緒 其中包括了負責IO的相關執行緒IO THREAD 1. 引數innodb_write_io_threads 寫執行緒 預設四個,負責資料塊的寫入 2. 引數innodb_read_io_threads 讀執行緒 預設四個,負責資料塊的讀取 上面兩個引數高併發下,可以設定為8. |
2.Purge thread
作用: 真正的刪除記錄和刪除undo log 1.清理刪除後的資料頁的空間(因為之前的刪除只是打上刪除標籤,並沒有正真刪除), 2.清理undo 舉例:表tb1中有記錄pk=1,2,3; 此時delete from tb1 where pk=1; 1. 將pk=1的記錄標記為刪除(delete-mark,infobits),資料庫中pk=1的記錄此時還是存在的,空間並沒有被釋放,該操作為同步操作(SQL執行完,也就標記完成了)。 2. purge ,該部分為後臺執行緒(purge執行緒)非同步操作,會真正的刪除該記錄,且空間被釋放。purge執行緒是系統自動的,無法人工控制。 標記為已刪除的原因 1. 該事物可能需要回滾,先作保留。 2. 當事物1去刪除pk=1且沒有提交時, 事物2應該要能看到pk=1的記錄(事物的隔離性)。 過濾條件是聚簇索引: 1. delete – 將該記錄標記為 delete-mark 。 2. update – 將該記錄 先物理delete (聚簇索引裡主鍵相同的行最多隻能有1個),然後 insert (或者可以原地更新[in place update])(即使刪除了,也可以通過undo進行還原)。 過濾條件是二級索引: 1. delete – 將該記錄標記為 delete-mark 2. update – 將該記錄標記為 delete-mark (索引列是columns + pk,即使是唯一索引更新也是和原來的不一樣),然後 insert 。 為什麼沒有insert” 1. insert操作是不需要非同步去purge,因為insert的記錄之前是不存在的; 2. 不存在記錄(未提交)是沒有別的事物能引用到的,所以insert以後,對應的undo可以直接刪除,而不需要等待非同步. purge 總結: 1. delete-mark的記錄最後會被purge執行緒回收,Purge會檢測記錄上是否有其他事物在引用undo,如果沒有就可以刪除。 2. innodb_purge_threads (5.6以後),可以設定的大一些,回收的速度會快一些。 innodb_purge_threads = 4 |
3.Insert-buffer thread
負責insert buffer與輔助索引的合併操作。
4.redo-log thread
負責重做日誌緩衝的磁碟寫入
5.Master thread(主執行緒)
後臺程序Master thread 裡面有兩種迴圈,再迴圈內可以呼叫其他執行緒進行相關的操作。 master thread的執行緒優先級別最高。 其內部幾個迴圈(loop)組成:主迴圈(loop),後臺迴圈(background loop),重新整理迴圈(flush loop),暫停迴圈(suspend loop)。 主迴圈有1s迴圈和10s迴圈. 1s迴圈即迴圈執行一次就sleep 1s後又執行一次又sleep 1 s. srv_master_thread loops: 745 1_second, 744 sleeps, 60 10_second, 179 background, 179 flush srv_master_thread log flush and writes: 744 各種迴圈執行的次數,據此判斷系統負載高低 |