在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 lock | FLUSH TABLES WITH READ LOCK整等待全局讀鎖建議:不要對線上業務數據庫加上全局讀鎖,通常是備份引起,可以放在業務低谷期間執行或者放在slave服務器上執行備份 |
Waiting for tables,Waiting for table flush | FLUSH 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引擎吧,別再老頑固了 |
更多詳情可參考官方手冊:8.14.2 General Thread States
8.14.2通用線程狀態
下表描述了State
與常規查詢處理而非更專門的活動(如複製)相關聯的線程值。其中許多僅用於發現服務器中的錯誤。
-
當線程在創建表的函數的末尾創建表(包括內部臨時表)時,會發生這種情況。即使由於某些錯誤而無法創建表,也會使用此狀態。
-
服務器正在執行就地服務
ALTER TABLE
。 -
該線程正在計算
MyISAM
表鍵分佈(例如forANALYZE TABLE
)。 -
線程正在檢查服務器是否具有執行該語句所需的特權。
-
線程正在執行表檢查操作。
-
該線程已處理一個命令,並準備釋放內存並重置某些狀態變量。
-
線程正在將已更改的表數據刷新到磁盤並關閉已使用的表。這應該是一個快速的操作。如果沒有,請驗證您沒有完整的磁盤,並且磁盤使用率不是很高。
-
committing alter table to storage engine
服務器已就地完成
ALTER TABLE
並提交結果。 -
線程正在將內部臨時表從
MEMORY
錶轉換爲磁盤MyISAM
表。 -
線程正在處理一條
ALTER TABLE
語句。在創建具有新結構的表之後但在將行復制到表中之前,將發生此狀態。 -
如果語句具有不同的條件
ORDER BY
和GROUP BY
條件,則行將按組排序並複製到臨時表中。 -
服務器正在複製到內存中的臨時表。
-
服務器正在複製到磁盤上的臨時表。臨時結果集太大(請參見 第8.4.4節“ MySQL中的內部臨時表使用”)。因此,線程將臨時表從內存中更改爲基於磁盤的格式,以節省內存。
-
線程正在處理
ALTER TABLE ... ENABLE KEYS
一個MyISAM
表。 -
線程正在處理
SELECT
使用內部臨時表解析的。 -
該線程正在創建一個表。這包括創建臨時表。
-
該線程正在內存或磁盤上創建一個臨時表。如果該表是在內存中創建的,但後來又轉換爲磁盤表,則該操作期間的狀態將爲
Copying to tmp table on disk
。 -
服務器正在執行多表刪除的第一部分。它僅從第一個表中刪除,並保存要用於從其他(參考)表中刪除的列和偏移量。
-
deleting from reference tables
服務器正在執行多表刪除的第二部分,並從其他表中刪除匹配的行。
-
線程正在處理
ALTER TABLE ... DISCARD TABLESPACE
orALTER TABLE ... IMPORT TABLESPACE
語句。 -
這發生在結束,但的清理之前
ALTER TABLE
,CREATE VIEW
,DELETE
,INSERT
,SELECT
,或UPDATE
語句。 -
該線程已開始執行一條語句。
-
線程正在使用
init_command
系統變量的值執行語句 。 -
線程已執行命令。在此狀態下完成的一些項目釋放涉及查詢緩存。此狀態通常後跟
cleaning up
。 -
服務器正在準備執行自然語言的全文本搜索。
-
出現這種情況的初始化之前
ALTER TABLE
,DELETE
,INSERT
,SELECT
,或UPDATE
語句。服務器在此狀態下采取的操作包括刷新二進制日誌,InnoDB
日誌和一些查詢緩存清除操作。對於
end
狀態,可能發生以下操作:-
更改表中的數據後刪除查詢緩存條目
-
將事件寫入二進制日誌
-
釋放內存緩衝區,包括用於blob的緩衝區
-
-
有人
KILL
向該線程發送了一條語句,下次檢查kill標誌時,它應該中止。在MySQL的每個主循環中都檢查該標誌,但是在某些情況下,線程死亡可能仍需要很短的時間。如果該線程被某個其他線程鎖定,則殺死操作將在另一個線程釋放其鎖定後立即生效。 -
線程正在將一條語句寫入慢速查詢日誌。
-
連接線程的初始狀態,直到客戶端已成功通過身份驗證。
-
服務器正在啓用或禁用表索引。
-
此狀態用於
SHOW PROCESSLIST
狀態。 -
線程正在嘗試打開表。除非有什麼阻止打開的步驟,否則這應該是非常快速的過程。例如,一個
ALTER TABLE
或LOCK TABLE
語句可以阻止打開表,直到該語句完成爲止。還值得檢查您的table_open_cache
價值是否足夠大。 -
服務器正在對查詢執行初始優化。
-
此狀態在查詢優化期間發生。
-
服務器正在準備執行就地
ALTER TABLE
。 -
該線程正在刪除不需要的中繼日誌文件。
-
此狀態在處理查詢之後但在該
freeing items
狀態之前發生 。 -
服務器正在從網絡讀取數據包。
-
查詢的使用
SELECT DISTINCT
方式使得MySQL無法在早期階段優化獨特的操作。因此,MySQL需要一個額外的階段來刪除所有重複的行,然後再將結果發送給客戶端。 -
線程在處理
SELECT
語句後正在刪除內部臨時表。如果沒有創建臨時表,則不使用此狀態。 -
線程正在重命名錶。
-
該線程正在處理一條
ALTER TABLE
語句,已經創建了新表,並且正在重命名它以替換原始表。 -
線程獲得了該表的鎖,但在獲得該鎖後注意到底層表結構已更改。它釋放了鎖,關閉了表,並試圖重新打開它。
-
修復代碼正在使用某種排序來創建索引。
-
該線程已完成對
MyISAM
表的多線程修復 。 -
修復代碼正在通過密鑰緩存一一創建密鑰。這比慢得多
Repair by sorting
。 -
線程正在回滾事務。
-
對於
MyISAM
表操作(例如修復或分析),線程會將新表狀態保存到.MYI
文件頭。狀態包括行數,AUTO_INCREMENT
計數器和鍵分佈等信息。 -
該線程正在執行第一個階段,以在更新所有匹配的行之前找到它們。如果
UPDATE
更改了用於查找所涉及行的索引,則必須執行此操作。 -
Sending data
線程正在讀取和處理
SELECT
語句的行 ,並將數據發送到客戶端。因爲在此狀態下發生的操作往往會執行大量磁盤訪問(讀取),所以它通常是給定查詢生命週期中運行時間最長的狀態。 -
線程正在開始
ALTER TABLE
操作。 -
線程正在做某種排序以滿足
GROUP BY
。 -
線程正在做某種排序以滿足
ORDER BY
。 -
該線程正在對索引頁進行排序,以在
MyISAM
表優化操作期間更有效地進行訪問。 -
對於
SELECT
語句,這與相似Creating sort index
,但對於非臨時表。 -
服務器正在計算統計信息以制定查詢執行計劃。如果線程長時間處於此狀態,則服務器可能是磁盤綁定的,正在執行其他工作。
-
從此線程已被調用
mysql_lock_tables()
,並且線程狀態尚未更新。這是一種非常普遍的狀態,可能由於多種原因而發生。例如,線程將要請求或正在等待表的內部或外部系統鎖定。
InnoDB
在執行期間等待表級鎖定時, 可能會發生這種情況LOCK TABLES
。如果此狀態是由對外部鎖的請求引起的,並且您沒有使用正在訪問同一 表的多個mysqld服務器,則MyISAM
可以使用該--skip-external-locking
選項禁用外部系統鎖 。但是,默認情況下禁用外部鎖定,因此此選項可能無效。對於SHOW PROFILE
,此狀態表示線程正在請求鎖定(不等待它)。 -
線程已準備好開始更新表。
-
線程正在搜索要更新的行,並且正在更新它們。
-
服務器正在執行多表更新的第一部分。它僅更新第一個表,並保存要用於更新其他(參考)表的列和偏移量。
-
服務器正在執行多表更新的第二部分,並從其他表更新匹配的行。
-
該線程將要請求或正在等待通過
GET_LOCK()
調用請求的諮詢鎖定 。對於SHOW PROFILE
,此狀態表示線程正在請求鎖定(不等待它)。 -
該線程已調用
SLEEP()
。 -
FLUSH TABLES WITH READ LOCK
正在等待提交鎖。 -
FLUSH TABLES WITH READ LOCK
正在等待全局讀取鎖定或read_only
正在設置全局 系統變量。 -
線程收到通知,表明表的基礎結構已更改,因此需要重新打開表以獲取新結構。但是,要重新打開該表,它必須等待,直到所有其他線程關閉了該表。
這張告示,如果另一個線程使用的地方
FLUSH TABLES
或有問題的表下面的語句之一: , , , , ,或 。FLUSH TABLES
tbl_name
ALTER TABLE
RENAME TABLE
REPAIR TABLE
ANALYZE TABLE
OPTIMIZE TABLE
-
該線程正在執行
FLUSH TABLES
並正在等待所有線程關閉其表,或者該線程收到有關表的基礎結構已更改的通知,並且需要重新打開表以獲取新結構。但是,要重新打開該表,它必須等待,直到所有其他線程關閉了該表。這張告示,如果另一個線程使用的地方
FLUSH TABLES
或有問題的表下面的語句之一: , , , , ,或 。FLUSH TABLES
tbl_name
ALTER TABLE
RENAME TABLE
REPAIR TABLE
ANALYZE TABLE
OPTIMIZE TABLE
-
服務器正在等待
THR_LOCK
從元數據鎖定子系統獲取 鎖或鎖,其中lock_type
指示了鎖的類型。此狀態表示正在等待
THR_LOCK
:-
Waiting for table level 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 metadata lock
-
Waiting for trigger metadata lock
有關表鎖定指示器的信息,請參見 第8.11.1節“內部鎖定方法”。有關元數據鎖定的信息,請參見第8.11.4節“元數據鎖定”。
-
-
線程正在等待條件變爲真的一般狀態。沒有特定的狀態信息。
-
服務器正在將數據包寫入網絡。