processlist中哪些狀態要引起關注

一般而言,我們在processlist結果中如果經常能看到某些SQL的話,至少可以說明這些SQL的頻率很高,通常需要對這些SQL進行進一步優化。

今天我們要說的是,在processlist中,看到哪些運行狀態時要引起關注,主要有下面幾個:

狀態建議
copy to tmp table執行ALTER TABLE修改表結構時建議:放在凌晨執行或者採用類似pt-osc工具
Copying to tmp table拷貝數據到內存中的臨時表,常見於GROUP BY操作時建議:創建適當的索引
Copying to tmp table on disk臨時結果集太大,內存中放不下,需要將內存中的臨時表拷貝到磁盤上,形成 #sql***.MYD、#sql***.MYI(在5.6及更高的版本,臨時表可以改成InnoDB引擎了,可以參考選項default_tmp_storage_engine建議:創建適當的索引,並且適當加大sort_buffer_size/tmp_table_size/max_heap_table_size
Creating sort index當前的SELECT中需要用到臨時表在進行ORDER BY排序建議:創建適當的索引
Creating tmp table創建基於內存或磁盤的臨時表,當從內存轉成磁盤的臨時表時,狀態會變成:Copying to tmp table on disk建議:創建適當的索引,或者少用UNION、視圖(VIEW)、子查詢(SUBQUERY)之類的,確實需要用到臨時表的時候,可以在session級臨時適當調大 tmp_table_size/max_heap_table_size的值
Reading from net表示server端正通過網絡讀取客戶端發送過來的請求建議:減小客戶端發送數據包大小,提高網絡帶寬/質量
Sending data從server端發送數據到客戶端,也有可能是接收存儲引擎層返回的數據,再發送給客戶端,數據量很大時尤其經常能看見備註:Sending Data不是網絡發送,是從硬盤讀取,發送到網絡是Writing to net

建議:通過索引或加上LIMIT,減少需要掃描並且發送給客戶端的數據量

Sorting result正在對結果進行排序,類似Creating sort index,不過是正常表,而不是在內存表中進行排序建議:創建適當的索引
statistics進行數據統計以便解析執行計劃,如果狀態比較經常出現,有可能是磁盤IO性能很差建議:查看當前io性能狀態,例如iowait
Waiting for global read lockFLUSH TABLES WITH READ LOCK整等待全局讀鎖建議:不要對線上業務數據庫加上全局讀鎖,通常是備份引起,可以放在業務低谷期間執行或者放在slave服務器上執行備份
Waiting for tables,Waiting for table flushFLUSH TABLES, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, OPTIMIZE TABLE等需要刷新表結構並重新打開建議:不要對線上業務數據庫執行這些操作,可以放在業務低谷期間執行
Waiting for lock_type lock等待各種類型的鎖: Waiting for event metadata lock Waiting for global read lock Waiting for schema metadata lock Waiting for stored function metadata lock Waiting for stored procedure metadata lock Waiting for table level lock Waiting for table metadata lock Waiting for trigger metadata lock建議:比較常見的是上面提到的global read lock以及table metadata lock,建議不要對線上業務數據庫執行這些操作,可以放在業務低谷期間執行。如果是table level lock,通常是因爲還在使用MyISAM引擎表,趕緊轉投InnoDB引擎吧,別再老頑固了

---轉自葉金榮老葉茶館,純粹自己覺得有必要mark一下,原文地址如下:

http://imysql.com/2015/06/10/mysql-faq-processlist-thread-states.shtml

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章