本文着重於命令拆解,要快速使用processlist,可閱讀下一篇文章:
MySQL性能分析 - (二) information_schema使用樣例(監控連接數、數據量、事務和鎖)
PostgreSQL的連接/事務監控,可參考《PostgreSQL中查看正在執行的SQL》
前言
登錄MySQL
後,有兩種方式獲取processlist:
show processlist
命令information_schema
庫中的processlist
表
兩種方法獲取到的信息基本相同,都包括這些屬性:ID
/USER
/HOST
/DB
/COMMAND
/TIME
/STATE
/INFO
;
具體值上稍有區別:show processlist
的Info
過長時會截取(100字符),且也不支持按屬性過濾,不利於分析。
show full processlist
會顯示所有信息,但展現太佔空間、不利於批量分析。
所以接下來我統一使用processlist
表的結果來介紹。1
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特徵,進行合併統計
以上。感謝您的耐心閱讀。