**前言:**咱們經常使用 show processlist
或 show full processlist
查看數據庫鏈接狀態,其中比較關注的是 State 列,此列表示該鏈接此刻所在的狀態。那麼你真的瞭解不一樣 State 值所表示的狀態嗎?下面咱們參考官方文檔來一探究竟 。html
以MySQL 5.7版本爲例 官方文檔地址:dev.mysql.com/doc/refman/…mysql
簡單翻譯下:sql
After create
數據庫
當線程在建立表的函數末尾建立表(包括內部臨時表)時,會發生這種狀況。即便因爲某些錯誤而沒法建立表,也會使用此狀態。緩存
Analyzing
服務器
線程正在計算MyISAM
表鍵分佈(例如,for ANALYZE 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
狀態,可能會發生如下操做:
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開始調用此狀態。
關於 Command 列的含義能夠參考:dev.mysql.com/doc/refman/…