兩種方式獲取processlist:
show processlist命令 information_schema庫中的processlist表
兩種方法獲取到的信息基本相同,都包括這些屬性:ID/USER/HOST/DB/COMMAND/TIME/STATE/INFO
; 具體值上稍有區別:show processlist
的Info過長時會截取(100字符),且也不支持按屬性過濾,不利於分析。 show full processlist
會顯示所有信息,但展現太佔空間、不利於批量分析。
processlist表的結果來介紹
CREATE TEMPORARY TABLE `PROCESSLIST` (
`ID` bigint(21) unsigned NOT NULL DEFAULT '0',
`USER` varchar(16) NOT NULL DEFAULT '',
`HOST` varchar(64) NOT NULL DEFAULT '',
`DB` varchar(64) DEFAULT NULL,
`COMMAND` varchar(16) NOT NULL DEFAULT '',
`TIME` int(7) NOT NULL DEFAULT '0',
`STATE` varchar(64) DEFAULT NULL,
`INFO` longtext
) ENGINE=MyISAM DEFAULT CHARSET=utf8
屬性說明
名詞約定:MySQL中一般用Thread(線程)表示一個執行計劃/任務,本文爲了便於從應用角度理解,用連接代替線程作爲表述。 官方依據:Each connection to mysqld runs in a separate thread. MySQL版本:5.6/5.7/8.x
ID
ID不難理解,就是mysql連接的唯一標識。該標識用途有兩個:
操作或過濾特定連接,比如使用kill命令時 定位問題連接。比如查看事務、鎖等時,其中都會有一個thread_id,這個就是對應的processlist.ID;通過這個關係,在分析複雜問題時可定位到具體連接 在下一篇博文的《事務/鎖相關統計》中有提到
USER
字面意思,創建數據庫連接的用戶。 即可用於用戶行爲追蹤,也可用於用戶行爲統計。
HOST
創建連接的服務器,一般由服務器IP+端口組成; 實際使用中,往往只有IP部分有用,比如按請求來源進行統計,使用時可以截取:substring(host, 1, instr(host, ":")-1)。
DB
該連接執行SQL的數據庫。 有些連接創建時可能未指定數據庫,因此該項可能爲空。
COMMAND
最早以爲是“命令”,用的時候才發現表示連接狀態。
該項值常見的有Sleep(休眠)、Query(查詢)、Connect(連接),其他值一般也不常見/用,有興趣可參考官方文檔說明2。
TIME
連接的在當前狀態(STATE)的持續時間,單位爲秒。 注意是“當前狀態的持續時間”。
官方文檔釋義1:
The time in seconds that the thread has been in its current state. For a slave SQL thread, the value is the number of seconds between the timestamp of the last replicated event and the real time of the slave machine.
一般狀態變化非常快、在每個狀態持續時間很短,如果持續多秒,說明就出現了問題。所以這個設定,讓時間成爲判斷SQL是否正常的關鍵要素。如果TIME是連接存在的時間,那麼就失去了這個意義了。
有朋友在主從模式下,遇到過時間爲負數的情況,可參考這篇文章:https://www.jianshu.com/p/9f180c37d983
STATE
SQL執行的狀態。
An action, event, or state that indicates what the thread is doing. 1
該項非常重要,往往會指出問題所在。 STATE要結合TIME來使用,即持續的時間比較長,則有問題的概率越大。
Most states correspond to very quick operations. If a thread stays in a given state for many seconds, there might be a problem that needs to be investigated.1
STATE的值比較多,建議閱讀完本文後,閱讀《MySQL性能分析 - (三) processlist的state屬性詳解》來深入瞭解
INFO
正在執行的完整SQL語句。
在實際分析中,該項也是很重要的信息。
定位到SQL,具體定位業務代碼、徹底解決問題也就不遠了 可通過提取多個SQL特徵,進行合併統計