共計 2215 個字符,預計需要花費 6 分鐘才能閱讀完成。
自動寫代碼機器人,免費開通
這篇文章給大家介紹如何在 MySQL 中使用 show processlist 命令檢視性能,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
user 列,顯示單前用戶,如果不是 root,這個命令就只顯示你權限范圍內的 sql 語句。
host 列,顯示這個語句是從哪個 ip 的哪個端口上發出的。呵呵,可以用來追蹤出問題語句的用戶。
db 列,顯示這個進程目前連接的是哪個數據庫。
command 列,顯示當前連接的執行的命令,一般就是休眠(sleep),查詢(query),連接(connect)。
time 列,此這個狀態持續的時間,單位是秒。
state 列,顯示使用當前連接的 sql 語句的狀態,很重要的列,后續會有所有的狀態的描述,請注意,state 只是語句執行中的某一個狀態,一個 sql 語句,已查詢為例,可能需要經過 copying to tmp table,Sorting result,Sending data 等狀態才可以完成
info 列,顯示這個 sql 語句,因為長度有限,所以長的 sql 語句就顯示不全,但是這是一個判斷問題語句的重要依據。

這個命令中最關鍵的就是 state 列,mysql 列出的狀態主要有以下幾種:
Checking table
正在檢查數據表(這是自動的)。
Closing tables
正在將表中修改的數據刷新到磁盤中,同時正在關閉已經用完的表。這是一個很快的操作,如果不是這樣的話,就應該確認磁盤空間是否已經滿了或者磁盤是否正處于重負中。
Connect Out
復制從服務器正在連接主服務器。
Copying to tmp table on disk
由于臨時結果集大于 tmp_table_size,正在將臨時表從內存存儲轉為磁盤存儲以此節省內存。
Creating tmp table
正在創建臨時表以存放部分查詢結果。
deleting from main table
服務器正在執行多表刪除中的第一部分,剛刪除第一個表。
deleting from reference tables
服務器正在執行多表刪除中的第二部分,正在刪除其他表的記錄。
Flushing tables
正在執行 FLUSH TABLES,等待其他線程關閉數據表。
Killed
發送了一個 kill 請求給某線程,那么這個線程將會檢查 kill 標志位,同時會放棄下一個 kill 請求。MySQL 會在每次的主循環中檢查 kill 標志位,不過有些情況下該線程可能會過一小段才能死掉。如果該線程程被其他線程鎖住了,那么 kill 請求會在鎖釋放時馬上生效。
Locked
被其他查詢鎖住了。
Sending data
正在處理 Select 查詢的記錄,同時正在把結果發送給客戶端。
Sorting for group
正在為 GROUP BY 做排序。
Sorting for order
正在為 ORDER BY 做排序。
Opening tables
這個過程應該會很快,除非受到其他因素的干擾。例如,在執 Alter TABLE 或 LOCK TABLE 語句行完以前,數據表無法被其他線程打開。正嘗試打開一個表。
Removing duplicates
正在執行一個 Select DISTINCT 方式的查詢,但是 MySQL 無法在前一個階段優化掉那些重復的記錄。因此,MySQL 需要再次去掉重復的記錄,然后再把結果發送給客戶端。
Reopen table
獲得了對一個表的鎖,但是必須在表結構修改之后才能獲得這個鎖。已經釋放鎖,關閉數據表,正嘗試重新打開數據表。
Repair by sorting
修復指令正在排序以創建索引。
Repair with keycache
修復指令正在利用索引緩存一個一個地創建新索引。它會比 Repair by sorting 慢些。
Searching rows for update
正在講符合條件的記錄找出來以備更新。它必須在 Update 要修改相關的記錄之前就完成了。
Sleeping
正在等待客戶端發送新請求.
System lock
正在等待取得一個外部的系統鎖。如果當前沒有運行多個 mysqld 服務器同時請求同一個表,那么可以通過增加 –skip-external-locking 參數來禁止外部系統鎖。
Upgrading lock
Insert DELAYED 正在嘗試取得一個鎖表以插入新記錄。
Updating
正在搜索匹配的記錄,并且修改它們。
User Lock
正在等待 GET_LOCK()。
Waiting for tables
該線程得到通知,數據表結構已經被修改了,需要重新打開數據表以取得新的結構。然后,為了能的重新打開數據表,必須等到所有其他線程關閉這個表。以下幾種情況下會產生這個通知:FLUSH TABLES tbl_name, Alter TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, 或 OPTIMIZE TABLE。
waiting for handler insert
Insert DELAYED 已經處理完了所有待處理的插入操作,正在等待新的請求。
大部分狀態對應很快的操作,只要有一個線程保持同一個狀態好幾秒鐘,那么可能是有問題發生了,需要檢查一下。還有其他的狀態沒在上面中列出來,不過它們大部分只是在查看服務器是否有存在錯誤是才用得著。
常用計數器

關于如何在 MySQL 中使用 show processlist 命令檢視性能就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
向 AI 問一下細節