MySQL使用SHOW PROCESSLIST的實(shí)現(xiàn)
更新時間:2025年03月28日 11:36:32 作者:半桶水專家
本文主要介紹了MySQL使用SHOW PROCESSLIST的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
1、SHOW PROCESSLIST 顯示進(jìn)程列表
SHOW [FULL] PROCESSLIST 用于查看當(dāng)前MySQL服務(wù)器上的所有運(yùn)行中的進(jìn)程列表信息。這個命令可以幫助我們了解哪些查詢正在執(zhí)行,它們的狀態(tài)是什么,以及它們已經(jīng)執(zhí)行了多長時間。
示例:
mysql> SHOW PROCESSLIST; +----+------+-----------+----+---------+------+-------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+-----------+----+---------+------+-------+------------------+ | 5 | root | localhost | | Query | 0 | init | show processlist | +----+------+-----------+----+---------+------+-------+------------------+ 1 row in set (0.00 sec)
其中每行顯示的信息包括:
- Id: 線程的唯一標(biāo)識符。
- User: 執(zhí)行該命令的用戶名。
- Host: 用戶的主機(jī)名。通常是客戶端IP地址、端口號或者都有。
- db: 當(dāng)前線程正在工作的數(shù)據(jù)庫。如果沒有選定數(shù)據(jù)庫,則為NULL。
- Command: 線程正在執(zhí)行的命令類型。例如:Sleep,Query,Locked等。
- Time: 命令開始執(zhí)行以來的秒數(shù)。對于'Sleep'命令,這是線程進(jìn)入睡眠狀態(tài)的時間。
- State: 顯示線程的狀態(tài)信息。這對找出性能問題特別有用。
- Info: 顯示線程正在執(zhí)行的查詢。若沒有查詢在執(zhí)行則該列為NULL。
如果沒有 FULL 關(guān)鍵字, SHOW PROCESSLIST 則僅顯示 Info 字段中每個語句的前 100 個字符。
2、線程Command有以下值:
- Binlog Dump:這是用于將二進(jìn)制日志內(nèi)容發(fā)送到副本的復(fù)制源上的線程。
- Change user:線程正在執(zhí)行更改用戶操作。
- Close stmt:線程正在關(guān)閉預(yù)備語句。
- Connect:被連接到源的復(fù)制接收器線程以及復(fù)制工作器線程使用。
- Connect Out:副本正在連接到其源。
- Create DB:線程正在執(zhí)行創(chuàng)建數(shù)據(jù)庫操作。
- Daemon:此線程對服務(wù)器內(nèi)部而言,不是為客戶端連接提供服務(wù)的線程。
- Debug:線程正在生成調(diào)試信息。
- Delayed insert:線程是一個延遲插入處理器。
- Drop DB:線程正在執(zhí)行刪除數(shù)據(jù)庫操作。
- Error:Execute:線程正在執(zhí)行預(yù)備語句。
- Fetch:線程正在獲取執(zhí)行預(yù)備語句的結(jié)果。
- Field List:線程正在檢索表列的信息。
- Init DB:線程正在選擇默認(rèn)數(shù)據(jù)庫。
- Kill:線程正在殺死另一個線程。
- Long Data:線程正在檢索執(zhí)行預(yù)備語句結(jié)果中的長數(shù)據(jù)。
- Ping:線程正在處理服務(wù)器ping請求。
- Prepare:線程正在準(zhǔn)備預(yù)備語句。
- Processlist:線程正在生成關(guān)于服務(wù)器線程的信息。
- Query:用戶客戶端在執(zhí)行查詢時使用,由單線程復(fù)制應(yīng)用程序線程使用,以及由復(fù)制協(xié)調(diào)器線程使用。
- Quit:線程正在終止。
- Refresh:線程正在刷新表、日志或緩存,或重置狀態(tài)變量或復(fù)制服務(wù)器信息。
- Register Slave:線程正在注冊副本服務(wù)器。
- Reset stmt:線程正在重置預(yù)備語句。
- Set option:線程正在設(shè)置或重置客戶端語句執(zhí)行選項(xiàng)。
- Shutdown:線程正在關(guān)閉服務(wù)器。
- Sleep:線程正在等待客戶端發(fā)送新的語句給它。
- Statistics:線程正在生成服務(wù)器狀態(tài)信息。
- Time:未使用。
3、線程狀態(tài)State分類有以下值
以下列表描述了與通用查詢處理相關(guān)的線程State值,并且不涉及更專門的活動,如復(fù)制。其中許多對于在服務(wù)器中查找錯誤非常有用。
- After create:當(dāng)線程創(chuàng)建一個表(包括內(nèi)部臨時表)時,會出現(xiàn)這種情況,在創(chuàng)建表的函數(shù)結(jié)束時。即使由于某些錯誤無法創(chuàng)建表,也會使用此狀態(tài)。
- altering table:服務(wù)器正在執(zhí)行就地ALTER TABLE。
- Analyzing:線程正在計(jì)算MyISAM表鍵分布(例如,用于ANALYZE TABLE)。
- checking permissions:線程正在檢查服務(wù)器是否具有執(zhí)行語句所需的權(quán)限。
- Checking table:線程正在執(zhí)行表檢查操作。
- cleaning up:線程已處理一條命令,并準(zhǔn)備釋放內(nèi)存并重置某些狀態(tài)變量。
- closing tables:線程正在將更改后的表數(shù)據(jù)刷新到磁盤并關(guān)閉已使用的表。這應(yīng)該是一個快速的操作。如果不是,驗(yàn)證你是否沒有滿磁盤,并且磁盤沒有在非常繁重的使用中。
- committing alter table to storage engine:服務(wù)器已完成就地ALTER TABLE并正在提交結(jié)果。
- converting HEAP to ondisk:線程正在將內(nèi)部臨時表從MEMORY表轉(zhuǎn)換為磁盤上的表。
- copy to tmp table:線程正在處理ALTER TABLE語句。在已創(chuàng)建新結(jié)構(gòu)的表之后但在將行復(fù)制進(jìn)去之前發(fā)生此狀態(tài)。
- 對于此狀態(tài)的線程,可以使用性能模式來獲取復(fù)制操作的進(jìn)度。
- Copying to group table:如果語句具有不同的ORDER BY和GROUP BY條件,則將按組排序行并復(fù)制到臨時表中。
- Copying to tmp table:服務(wù)器正在將數(shù)據(jù)復(fù)制到內(nèi)存中的臨時表。
- Copying to tmp table on disk:服務(wù)器正在將數(shù)據(jù)復(fù)制到磁盤上的臨時表。臨時結(jié)果集已經(jīng)變得過大。因此,線程正在將臨時表從內(nèi)存格式更改為基于磁盤的格式以節(jié)省內(nèi)存。
- Creating index:線程正在處理MyISAM表的ALTER TABLE ... ENABLE KEYS。
- Creating sort index:線程正在處理使用內(nèi)部臨時表解析的SELECT。
- creating table:線程正在創(chuàng)建表。這包括創(chuàng)建臨時表。
- Creating tmp table:線程正在在內(nèi)存或磁盤上創(chuàng)建臨時表。如果在內(nèi)存中創(chuàng)建了表,但稍后將其轉(zhuǎn)換為磁盤上的表,則在該操作期間的狀態(tài)為Copying to tmp table on disk。
- deleting from main table:服務(wù)器正在執(zhí)行多表刪除的第一部分。它只從第一個表中刪除,并保存列和偏移量以用于從其他(引用)表中刪除。
- deleting from reference tables:服務(wù)器正在執(zhí)行多表刪除的第二部分,并從其他表中刪除匹配的行。
- discard_or_import_tablespace:線程正在處理ALTER TABLE ... DISCARD TABLESPACE或ALTER TABLE ... IMPORT TABLESPACE語句。
- end:在ALTER TABLE,CREATE VIEW,DELETE,INSERT,SELECT或UPDATE語句的結(jié)束但在清理之前發(fā)生。
- 對于結(jié)束狀態(tài),可能正在發(fā)生以下操作:
- 將事件寫入二進(jìn)制日志
- 釋放內(nèi)存緩沖區(qū),包括blob:executing:線程已開始執(zhí)行語句。
- Execution of init_command:線程正在執(zhí)行init_command系統(tǒng)變量的值中的語句。
- freeing items:線程已執(zhí)行一條命令。這個狀態(tài)通常在cleaning up之前出現(xiàn)。
- FULLTEXT initialization:服務(wù)器正在準(zhǔn)備進(jìn)行自然語言全文搜索。
- init:在初始化ALTER TABLE,DELETE,INSERT,SELECT或UPDATE語句之前發(fā)生。在這種狀態(tài)下,服務(wù)器采取的操作包括刷新二進(jìn)制日志和InnoDB日志。
- Killed:有人向線程發(fā)送了一個KILL語句,它應(yīng)該在下次檢查kill標(biāo)志時中止。該標(biāo)志在MySQL的每一個主要循環(huán)中都會被檢查,但在某些情況下,線程可能還需要短暫的時間才能死亡。如果線程被其他線程鎖定,則在其他線程釋放其鎖定后立即生效。
- Locking system tables:線程正在嘗試鎖定一個系統(tǒng)表(例如,一個時區(qū)或日志表)。
- logging slow query:線程正在將語句寫入慢查詢?nèi)罩尽?/li>
- login:連接線程的初始狀態(tài),直到客戶端成功進(jìn)行身份驗(yàn)證。
- manage keys:服務(wù)器正在啟用或禁用表索引。
- Opening system tables:線程正在嘗試打開一個系統(tǒng)表(例如,一個時區(qū)或日志表)。
- Opening tables:線程正在嘗試打開表。這應(yīng)該是非??焖俚倪^程,除非有什么阻止打開。例如,ALTER TABLE或LOCK TABLE語句可以阻止打開表,直到語句完成。還值得檢查您的table_open_cache值是否足夠大。
- 對于系統(tǒng)表,使用Opening system tables狀態(tài)代替。
- optimizing:服務(wù)器正在為查詢執(zhí)行初始優(yōu)化。
- preparing:此狀態(tài)在查詢優(yōu)化期間發(fā)生。
- preparing for alter table:服務(wù)器正在準(zhǔn)備執(zhí)行就地ALTER TABLE。
- Purging old relay logs:線程正在刪除不需要的中繼日志文件。
- query end:處理查詢后但在freeing items狀態(tài)之前發(fā)生此狀態(tài)。
- Receiving from client:服務(wù)器正在從客戶端讀取數(shù)據(jù)包。
- Removing duplicates:查詢正在以SELECT DISTINCT的方式使用,以致MySQL無法在早期階段優(yōu)化掉DISTINCT操作。由于此原因,MySQL需要一個額外的階段來移除所有重復(fù)的行,然后再將結(jié)果發(fā)送給客戶端。
- removing tmp table:線程在處理完SELECT語句后正在移除內(nèi)部臨時表。如果沒有創(chuàng)建臨時表,則不使用此狀態(tài)。
- rename:線程正在重命名表。
- rename result table:線程正在處理ALTER TABLE語句,已經(jīng)創(chuàng)建了新表,并正將其重命名以替換原始表。
- Reopen tables:線程獲取了表的鎖,但在獲取鎖后發(fā)現(xiàn)表的底層結(jié)構(gòu)已更改。它已釋放了鎖,關(guān)閉了表,正在嘗試重新打開它。
- Repair by sorting:修復(fù)代碼使用排序來創(chuàng)建索引。
- Repair done:線程已完成MyISAM表的多線程修復(fù)。
- Repair with keycache:修復(fù)代碼使用一次通過鍵緩存創(chuàng)建一個鍵。這比Repair by sorting慢得多。
- Rolling back:線程正在回滾事務(wù)。
- Saving state:對于MyISAM表操作,如修復(fù)或分析,線程正在將新表狀態(tài)保存到.MYI文件頭。狀態(tài)包括行數(shù)、AUTO_INCREMENT計(jì)數(shù)器和鍵分布等信息。
- Searching rows for update:線程正在進(jìn)行第一階段,查找所有匹配的行,然后更新它們。如果UPDATE改變了用于查找所涉及行的索引,則必須這樣做。
- Sending data:在MySQL 8.0.17之前:線程正在讀取和處理SELECT語句的行,并將數(shù)據(jù)發(fā)送給客戶端。因?yàn)樵诖藸顟B(tài)期間發(fā)生的操作傾向于執(zhí)行大量的磁盤訪問(讀取),所以它通常是給定查詢在其生命周期內(nèi)運(yùn)行時間最長的狀態(tài)。MySQL 8.0.17及更高版本:此狀態(tài)不再單獨(dú)指示,而是包含在Executing狀態(tài)中。
- Sending to client:服務(wù)器正在將數(shù)據(jù)包寫入客戶端。
- setup:線程開始進(jìn)行ALTER TABLE操作。
- Sorting for group:線程正在執(zhí)行排序以滿足GROUP BY。
- Sorting for order:線程正在執(zhí)行排序以滿足ORDER BY。
- Sorting index:線程正在對索引頁進(jìn)行排序,以便在MyISAM表優(yōu)化操作期間更有效地訪問。
- Sorting result:對于SELECT語句,此為與Creating sort index類似,但適用于非臨時表。
- starting:語句執(zhí)行開始的第一階段。
- statistics:服務(wù)器正在計(jì)算統(tǒng)計(jì)信息以制定查詢執(zhí)行計(jì)劃。如果線程在此狀態(tài)下停留了很長時間,那么服務(wù)器可能在磁盤綁定中執(zhí)行其他工作。
- System lock:線程已調(diào)用mysql_lock_tables()并且自那時起線程狀態(tài)未更新。這是一個非常通用的狀態(tài),可能出于許多原因。
- 例如,線程將請求或正在等待表的內(nèi)部或外部系統(tǒng)鎖。當(dāng)InnoDB在執(zhí)行LOCK TABLES期間等待表級鎖時,可能會發(fā)生這種情況。如果由于請求外部鎖而導(dǎo)致這種狀態(tài),并且您沒有使用訪問相同MyISAM表的多個mysqld服務(wù)器,則可以使用--skip-external-locking選項(xiàng)禁用外部系統(tǒng)鎖。然而,默認(rèn)情況下是禁用外部鎖定的,所以有可能這個選項(xiàng)沒有效果。對于SHOW PROFILE,此狀態(tài)意味著線程正在請求鎖(不是等待它)。
- 對于系統(tǒng)表,使用Locking system tables狀態(tài)代替。
- update:線程準(zhǔn)備開始更新表。
- Updating:線程正在搜索要更新的行并更新它們。
- updating main table:服務(wù)器正在執(zhí)行多表更新的第一部分。它只更新第一個表,并保存列和偏移量以用于更新其他(引用)表。
- updating reference tables:服務(wù)器正在執(zhí)行多表更新的第二部分,并更新其他表中的匹配行。
- User lock:線程將請求或正在等待使用GET_LOCK()調(diào)用請求的咨詢鎖。對于SHOW PROFILE,這種狀態(tài)意味著線程正在請求鎖(而不是等待它)。
- User sleep:線程已調(diào)用SLEEP()。
- Waiting for commit lock:FLUSH TABLES WITH READ LOCK正在等待提交鎖。
- waiting for handler commit:線程正在等待事務(wù)提交,與查詢處理的其他部分相比。
- Waiting for tables:線程收到通知,表的底層結(jié)構(gòu)已經(jīng)更改,它需要重新打開表以獲取新的結(jié)構(gòu)。但是,要重新打開表,它必須等待所有其他線程都關(guān)閉了所述表。
- 如果另一個線程在所述表上使用了FLUSH TABLES或以下語句之一:FLUSH TABLES tbl_name,ALTER TABLE,RENAME TABLE,REPAIR TABLE,ANALYZE TABLE,OPTIMIZE TABLE,則會發(fā)生此通知。
- Waiting for table flush:線程正在執(zhí)行FLUSH TABLES并等待所有線程關(guān)閉其表,或者線程收到通知說表的底層結(jié)構(gòu)已經(jīng)更改,它需要重新打開表以獲取新的結(jié)構(gòu)。但是,要重新打開表,它必須等待所有其他線程都關(guān)閉了所述表。
- 如果另一個線程在所述表上使用了FLUSH TABLES或以下語句之一:FLUSH TABLES tbl_name,ALTER TABLE,RENAME TABLE,REPAIR TABLE,ANALYZE TABLE,OPTIMIZE TABLE,則會發(fā)生此通知。
- Waiting for lock_type lock:服務(wù)器正在等待獲得THR_LOCK鎖或元數(shù)據(jù)鎖定子系統(tǒng)的鎖,其中l(wèi)ock_type指示鎖的類型。
- 這種狀態(tài)表示等待一個THR_LOCK:
- Waiting for table level lock:這些狀態(tài)表示等待元數(shù)據(jù)鎖:
- 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:有關(guān)表鎖指標(biāo)的信息。有關(guān)元數(shù)據(jù)鎖定的信息。要查看哪些鎖阻止了鎖請求。
- Waiting on cond:線程在等待某個條件變?yōu)檎娴耐ㄓ脿顟B(tài)。沒有特定的狀態(tài)信息可用。
- Writing to net:服務(wù)器正在將數(shù)據(jù)包寫入網(wǎng)絡(luò)。
相關(guān)文章
關(guān)于MySQL innodb_autoinc_lock_mode介紹
下面小編就為大家?guī)硪黄P(guān)于MySQL innodb_autoinc_lock_mode介紹。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03