前言: 我們常用 show processlist
或 show full processlist
查看數據庫連接狀態,其中比較關注的是 State 列,此列表示該連接此刻所在的狀態。那么你真的了解不同 State 值所表示的狀態嗎?下面我們參考官方文檔來一探究竟 。
以MySQL 5.7版本為例
官方文檔地址: https://dev.mysql.com/doc/refman/5.7/en/general-thread-states.html
簡單翻譯下:
-
After create
當線程在創建表的函數末尾創建表(包括內部臨時表)時,會發生這種情況。即使由於某些錯誤而無法創建表,也會使用此狀態。
-
Analyzing
線程正在計算
MyISAM
表鍵分布(例如,forANALYZE TABLE
)。 -
checking permissions
線程正在檢查服務器是否具有執行語句所需的權限。
-
Checking table
該線程正在執行表檢查操作。
-
cleaning up
該線程已經處理了一個命令,並准備釋放內存並重置某些狀態變量。
-
closing tables
該線程正在將更改的表數據刷新到磁盤並關閉已使用的表。這應該是一個快速的操作。如果沒有,請驗證您的磁盤空間剩余。
-
converting HEAP to ondisk
該線程正在將內部臨時表從
MEMORY
表轉換為磁盤表。 -
copy to tmp table
線程正在處理一個
ALTER TABLE
語句。在創建具有新結構的表但在將行復制到其中之前,將發生此狀態。對於處於此狀態的線程,可以使用性能模式來獲取有關復制操作的進度。
-
Copying to group table
如果語句具有不同的條件
ORDER BY
和GROUP BY
標准,則按組對行進行排序並將其復制到臨時表。 -
Copying to tmp table
服務器正在復制到內存中的臨時表。
-
altering table
服務器正在執行就地
ALTER TABLE
。 -
Copying to tmp table on disk
服務器正在復制到磁盤上的臨時表。
-
Creating index
線程正在處理
ALTER TABLE ... ENABLE KEYS
一個MyISAM
表。 -
Creating sort index
線程正在處理
SELECT
使用內部臨時表解析的線程 。 -
creating table
線程正在創建一個表。這包括創建臨時表。
-
Creating tmp table
該線程正在內存或磁盤上創建臨時表。如果表在內存中創建但稍后轉換為磁盤表,則該操作期間的狀態將為
Copying to tmp table on disk
。 -
committing alter table to storage engine
服務器已完成就地
ALTER TABLE
並提交結果。 -
deleting from main table
服務器正在執行多表刪除的第一部分。它僅從第一個表中刪除,並保存用於從其他(引用)表中刪除的列和偏移量。
-
deleting from reference tables
服務器正在執行多表刪除的第二部分,並從其他表中刪除匹配的行。
-
discard_or_import_tablespace
線程正在處理
ALTER TABLE ... DISCARD TABLESPACE
或ALTER TABLE ... IMPORT TABLESPACE
聲明。 -
end
這發生在結束,但的清理之前
ALTER TABLE
,CREATE VIEW
,DELETE
,INSERT
,SELECT
,或UPDATE
語句。 -
executing
該線程已開始執行語句。
-
Execution of init_command
線程正在執行
init_command
系統變量值中的語句 。 -
freeing items
線程執行了一個命令。在此狀態期間完成的一些項目的釋放涉及查詢緩存。這種狀態通常緊隨其后
cleaning up
。 -
FULLTEXT initialization
服務器正准備執行自然語言全文搜索。
-
init
出現這種情況的初始化之前
ALTER TABLE
,DELETE
,INSERT
,SELECT
,或UPDATE
語句。服務器在此狀態下采取的操作包括刷新二進制日志,InnoDB
日志和一些查詢緩存清理操作。對於
end
狀態,可能會發生以下操作:- 刪除表中的數據后刪除查詢緩存條目
- 將事件寫入二進制日志
- 釋放內存緩沖區,包括blob
-
Killed
有人
KILL
向線程發送了一個語句,它應該在下次檢查kill標志時中止。在MySQL的每個主循環中檢查該標志,但在某些情況下,線程可能仍然需要很短的時間才能死掉。如果線程被某個其他線程鎖定,則一旦另一個線程釋放其鎖定,kill就會生效。 -
logging slow query
該線程正在向慢查詢日志寫一條語句。
-
login
連接線程的初始狀態,直到客戶端成功通過身份驗證。
-
manage keys
服務器正在啟用或禁用表索引。
-
NULL
該狀態用於該
SHOW PROCESSLIST
狀態。 -
Opening tables
線程正在嘗試打開一個表。這應該是非常快的程序,除非有什么東西阻止打開。例如,一個
ALTER TABLE
或一個LOCK TABLE
語句可以阻止在語句結束之前打開表。 -
optimizing
服務器正在對查詢執行初始優化。
-
preparing
在查詢優化期間發生此狀態。
-
Purging old relay logs
該線程正在刪除不需要的中繼日志文件。
-
query end
處理查詢后但在
freeing items
狀態之前發生此 狀態。 -
Receiving from client
服務器正在從客戶端讀取數據包。
Reading from net
在MySQL 5.7.8之前調用此狀態。 -
Removing duplicates
該查詢使用
SELECT DISTINCT
的方式是MySQL無法在早期階段優化掉不同的操作。因此,在將結果發送到客戶端之前,MySQL需要額外的階段來刪除所有重復的行。 -
removing tmp table
該線程在處理
SELECT
語句后刪除內部臨時表。如果未創建臨時表,則不使用此狀態。 -
rename
該線程正在重命名一個表。
-
rename result table
線程正在處理一個
ALTER TABLE
語句,創建了新表,並重命名它以替換原始表。 -
Reopen tables
該線程獲得了表的鎖定,但在獲取鎖定之后注意到基礎表結構發生了變化。它釋放了鎖,關閉了桌子,並試圖重新打開它。
-
Repair by sorting
修復代碼使用排序來創建索引。
-
preparing for alter table
服務器正准備執行就地
ALTER TABLE
。 -
Repair done
該線程已完成對
MyISAM
表的多線程修復 。 -
Repair with keycache
修復代碼通過密鑰緩存逐個創建密鑰。這比慢得多
Repair by sorting
。 -
Rolling back
該線程正在回滾一個事務。
-
Saving state
對於
MyISAM
諸如修復或分析的表操作,線程將新表狀態保存到.MYI
文件頭。狀態包括諸如行數,AUTO_INCREMENT
計數器和密鑰分發之類的信息。 -
Searching rows for update
該線程正在進行第一階段以在更新之前查找所有匹配的行。如果
UPDATE
要更改用於查找所涉及行的索引,則必須執行此操作。 -
Sending data
線程正在讀取和處理
SELECT
語句的行 ,並將數據發送到客戶端。由於在此狀態期間發生的操作往往會執行大量磁盤訪問(讀取),因此它通常是給定查詢生命周期中運行時間最長的狀態。 -
Sending to client
服務器正在向客戶端寫入數據包。
Writing to net
在MySQL 5.7.8之前調用此狀態。 -
setup
線程正在開始一個
ALTER TABLE
操作。 -
Sorting for group
線程正在進行排序以滿足
GROUP BY
。 -
Sorting for order
線程正在進行排序以滿足
ORDER BY
。 -
Sorting index
該線程正在對索引頁面進行排序,以便在
MyISAM
表優化操作期間進行更有效的訪 -
Sorting result
對於
SELECT
聲明,這類似於Creating sort index
非臨時表。 -
statistics
服務器正在計算統計信息以開發查詢執行計划。如果線程長時間處於此狀態,則服務器可能是磁盤綁定執行其他工作。
-
System lock
線程已經調用
mysql_lock_tables()
,並且線程狀態尚未更新。這是一個非常普遍的狀態,可能由於多種原因而發生。例如,線程將請求或正在等待表的內部或外部系統鎖定。
InnoDB
在執行期間等待表級鎖定時會 發生這種情況LOCK TABLES
。如果此狀態是由外部鎖的請求引起的,並且您沒有使用多個訪問相同 表的 mysqld 服務器,則MyISAM
可以使用該--skip-external-locking
選項禁用外部系統鎖 。但是,默認情況下禁用外部鎖定,因此該選項很可能無效。對於SHOW PROFILE
,這個狀態意味着線程正在請求鎖定(不等待它)。 -
update
線程正准備開始更新表。
-
Updating
線程正在搜索要更新的行並正在更新它們。
-
updating main table
服務器正在執行多表更新的第一部分。它僅更新第一個表,並保存用於更新其他(引用)表的列和偏移量。
-
updating reference tables
服務器正在執行多表更新的第二部分,並更新其他表中的匹配行。
-
User lock
該線程將要求或正在等待通過
GET_LOCK()
呼叫請求的咨詢鎖 。對於SHOW PROFILE
,此狀態表示線程正在請求鎖定(不等待它)。 -
User sleep
線程已經調用了一個
SLEEP()
調用。 -
Waiting for commit lock
FLUSH TABLES WITH READ LOCK
正在等待提交鎖定。 -
Waiting for global read lock
FLUSH TABLES WITH READ LOCK
正在等待全局讀鎖定或read_only
正在設置全局 系統變量。 -
Waiting for tables
線程得到一個通知,表明表的底層結構已經改變,它需要重新打開表以獲得新結構。但是,要重新打開表,它必須等到所有其他線程關閉了相關表。
-
Waiting for table flush
線程正在執行
FLUSH TABLES
並且正在等待所有線程關閉它們的表,或者線程得到一個表的基礎結構已經更改的通知,並且它需要重新打開表以獲取新結構。但是,要重新打開表,它必須等到所有其他線程關閉了相關表。 -
Waiting for *lock_type* lock
服務器正在等待
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
-
-
Waiting on cond
線程正在等待條件變為真的通用狀態。沒有具體的州信息。
-
Writing to net
服務器正在將數據包寫入網絡。
Sending to client
從MySQL 5.7.8開始調用此狀態。