標籤:distinct init create alter 不同 釋放 匹配 man kill
mysql> show full processlist或者mysql> show processlist;+---------+-----------+-------------------+----------+-------------+---------+------------------------+---------------------------------------+| Id | User | Host | db | Command | Time | State | Info |+---------+-----------+-------------------+----------+-------------+---------+------------------------+---------------------------------------+| 3672856 | abce | 192.168.5.1:38311 | abce | Query | 0 | Sending data | select count(1) from (select +---------+-----------+-------------------+----------+-------------+---------+------------------------+---------------------------------------+
說明:
ID:id標識。kill使用者的時候有用User:當前串連的使用者Host:目前使用者串連是從哪個ip和port串連過來的db:資料庫名Command:串連狀態,一般是休眠(sleep),查詢(query),串連(connect)Time:串連持續的時間,單位是秒State:當前sql語句的狀態Info:sql語句內容
其中state的狀態十分關鍵,下表列出state主要狀態和描述:
| 狀態 |
說明 |
建議 |
| After create |
當線程建立一個表(包括暫存資料表),建立函數結束時的狀態。 即使因為某些原因建立失敗,也會顯示。 |
|
| Analyzing |
線程正在估算myisam表的鍵的分布 |
|
| checking permissions |
許可權檢查 |
|
| Checking table |
檢查表 |
|
| cleaning up |
命令結束,準備釋放記憶體和重設狀態變數 |
|
| closing tables |
重新整理表資料到磁碟並關閉表。 這個狀態一般比較快,否則就該查看一下磁碟的使用了 |
|
| converting HEAP to MyISAM |
將內部記憶體暫存資料表轉成成磁碟上的myisam表 |
|
| copy to tmp table |
線程在執行alter table命令。 發生在表結構已經修改,但是資料還沒有拷貝回去 |
建議:淩晨執行 |
| altering table |
原地執行alter table命令 |
|
| Copying to tmp table |
從記憶體將資料拷貝到暫存資料表 |
建議:建立索引 |
| Copying to group table |
如果語句的order by和group by列不同,行被分組排序並拷貝到暫存資料表 |
|
| Copying to tmp table on disk |
拷貝到磁碟上的暫存資料表。 臨時結果集太大,因為線程要將記憶體中的資料拷貝到磁碟上以便節省記憶體。 |
建議:建立索引,加大tmp_table_size/max_heap_table_size |
| Creating index |
正在對myisam表執行alter table … enable keys |
|
| 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 |
|
| freeing items |
線程已經執行完一個命令。釋放一些items |
|
| FULLTEXT initialization |
準備執行全完檢索 |
|
| Removing duplicates |
查詢使用了distinct |
|
| removing tmp table |
移除內部暫存資料表 |
|
| Reading from net |
server端正通過網路讀取用戶端發送過來的請求 |
建議:減小用戶端發送資料包大小,提高網路頻寬/品質 |
| Sending data |
從server端發送資料到用戶端,也有可能是接收儲存引擎層返回的資料,再發送給用戶端,資料量很大時尤其經常能看見 |
建議:通過索引或LIMIT,減少需要掃描的資料量 |
| Sorting result |
正在對結果進行排序,類似Creating sort index,不過是正常表,而不是在記憶體表中進行排序 |
建議:建立索引 |
| Statistics |
進行資料統計以便解析執行計畫,如果狀態比較經常出現,有可能是磁碟IO效能很差 |
建議:查看當前io效能狀態,例如iowait |
| System lock |
正在等待系統級鎖 |
建議:關閉外部鎖skip-external-locking(已經預設關閉了) |
| Waiting for global read lock |
通常是FLUSH TABLES WITH READ LOCK整等待全域讀鎖 |
|
Waiting for tables, 或Waiting for table flush |
通常是因為FLUSH TABLES, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, OPTIMIZE TABLE等需要重新整理表結構並重新開啟 |
|
MySQL -- show processlist