MySQL性能分析之show processlist及information_schema.processlist详解

本文着重于命令拆解,要快速使用processlist,可阅读下一篇文章:
MySQL性能分析 - (二) information_schema使用样例(监控连接数、数据量、事务和锁)

PostgreSQL的连接/事务监控,可参考《PostgreSQL中查看正在执行的SQL》

前言

登录MySQL后,有两种方式获取processlist:

  • show processlist命令
  • information_schema库中的processlist
    在这里插入图片描述

两种方法获取到的信息基本相同,都包括这些属性:ID/USER/HOST/DB/COMMAND/TIME/STATE/INFO
具体值上稍有区别:show processlistInfo过长时会截取(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特征,进行合并统计

以上。感谢您的耐心阅读。


  1. MySQL官方文档 - processlist表:https://dev.mysql.com/doc/refman/5.6/en/processlist-table.html ↩︎ ↩︎ ↩︎ ↩︎

  2. MySQL官方文档 - 命令类型:https://dev.mysql.com/doc/refman/5.6/en/thread-commands.html ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章