本文着重于命令拆解,要快速使用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特征,进行合并统计
以上。感谢您的耐心阅读。