本文着重于命令拆解,要快速使用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不难理解,就是mysql连接的唯一标识。该标识用途有两个:

    • 操作或过滤特定连接,比如使用kill命令时
    • 定位问题连接。比如查看事务、锁等时,其中都会有一个thread_id,这个就是对应的processlist.ID;通过这个关系,在分析复杂问题时可定位到具体连接

      在下一篇博文的《事务/锁相关统计》中有提到

      字面意思,创建数据库连接的用户。
      即可用于用户行为追踪,也可用于用户行为统计。

      创建连接的服务器,一般由服务器IP+端口组成;
      实际使用中,往往只有IP部分有用,比如按请求来源进行统计,使用时可以截取:substring(host, 1, instr(host, ":")-1)

      该连接执行SQL的数据库。
      有些连接创建时可能未指定数据库,因此该项可能为空。

      COMMAND

      最早以为是“命令”,用的时候才发现表示连接状态。

      该项值常见的有Sleep(休眠)、Query(查询)、Connect(连接),其他值一般也不常见/用,有兴趣可参考官方文档说明2

      连接的在当前状态(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属性详解》来深入了解

      正在执行的完整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 ↩︎

      mysql里,我们一般通过show (full)processlist查看当前连接情况,处理各种数据库问题。现在在information_schema模式下,5.5以后增加了processlist,里面存储了当前连接信息,跟show (full) processlist存储的一样。通过processlist 我们可以统计分析一些信息,而不依赖于shell命令(如 grep、awk等) 如 查询当前ip的连接信息 mysql> select substring_index(host,':',1
        一个标识,你要kill一个语句的时候很有用,用命令杀掉此查询 /*/mysqladmin kill 进程号。 user列   显示单前用户,如果不是root,这个命令就只显示你权限范围内的sql语句。 host列   显示这个语句是从哪个ip的哪个端口上发出的。用于追踪出问题语句的用户。   显示这个进程目前连接的是哪个数据库。 command列   显示当前连接的执行的命令,. use information_schema; select concat(round(sum(data_length/1024/1024/1024),2),'G') from tables; #查询所有数据库的容量大小 二、查询指定数据库、指定的容量大小(单位:MB) use information_schema; select concat(round(sum(DATA_LENGTH/1024/1024...
      一、是什么?怎么玩? MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。 具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10秒以上的语句。 由他来查看哪些S...
      "SHOW PROCESSLIST" 是 MySQL 中的一个 SQL 命令,它用于查看当前连接到 MySQL 服务器的所有客户端的连接状态和活动。它返回的结果包括连接的客户端的 IP 地址、用户名、进程 ID 以及当前正在执行的查询。 如果要查看特定用户的进程,可以在命令后面添加 WHERE user='user_name'。 这个命令对于查看和管理 MySQL 数据库服务器很有用,特别是在查看正在运行的查询和管理长时间运行的查询时。 应该是共享1byte NULL标识字段的意思。 就是前文提到的每个NULL字段的会占1bit的NULL标识位,mysql会将其组装成1byte的字段存放。 所以不管是1个null字段还是8个null字段,都会占1byte的大小。 如果最后一句话按照作者严谨的逻辑再严格一点的话,应该是10+1/n(n=1,2,3,4,5,6,7,8)。 当然这样有点吹毛求疵了,不提倡不提倡表情包 Markdown文本样式(加粗、斜体、下划线、删除线、高亮、下标/上标) hyc729: <mark>文本高亮</mark> 少了一个“/”,小问题 MySQL ERROR 16 (42000):FUNCTION sum does not exist. Check the ‘Function Name Parsing and Resolution‘ qq_41005579: 同被坑了,pg和oracle都好好的 MySQL中VARCHAR最大长度是多少?CHAR和VARCHAR有哪些区别? tongabcde: