MySQL線程狀態詳解

前言: 咱們經常使用 show processlist show full processlist 查看數據庫鏈接狀態,其中比較關注的是 State 列,此列表示該鏈接此刻所在的狀態。那麼你真的瞭解不一樣 State 值所表示的狀態嗎?下面咱們參考官方文檔來一探究竟 。html

以MySQL 5.7版本爲例
官方文檔地址: https://dev.mysql.com/doc/refman/5.7/en/general-thread-states.html 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 狀態,可能會發生如下操做:

      • 刪除表中的數據後刪除查詢緩存條目
      • 將事件寫入二進制日誌
      • 釋放內存緩衝區,包括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開始調用此狀態。

相關文章
相關標籤/搜索