1. 程式人生 > >mysql常見後臺執行緒

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=123;

此時delete from tb1 where pk=1;

1. pk=1的記錄標記為刪除(delete-markinfobits),資料庫中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

各種迴圈執行的次數,據此判斷系統負載高低