一句 mysql#show processlist 引发的思想“革命”

前几天在看一个亿级的视频中谈到mysql优化和解决的方案,其中说到一个命令 show processlist,由于对这个命令也是基于工作经验的普通使用,并没有深入研究,所以突然想深入了解下这个命令的一些使用以及原理,所以整理下技术栈。

那好,要理解及使用这个命令,首先就要弄清楚:
  1. show processlist 是什么命令?
  2. show processlist 在什么时候使用?
  3. show processlist 怎么使用?
  4. show processlist 在mysql中的实现原理。
show processlist 是什么?

show processlist 字面意思就是,显示进程列表,这个列表最多显示100条纪录,要显示全部数据,使用show full processlist

show processlist 在什么时候使用?

这命令,不限制场景使用,但是使用频次最高的,莫过于数据库出现瓶颈的时候,需要分析数据,查看哪个进程执行时间比较长,哪些进程一直没有执行完而释放。然后针对某些情况,把进程 kill 掉;杀掉进程的命令是:kill id(进程号)

show processlist 怎么使用?

那很多人就会问,这个命令怎么使用,或者说,怎么分析这个命令的数据结果;
执行 show processlist 后,会出现类似以下结果

在哪里执行 show processlist 命令?
1、直接在命令行模式下执行
mysql# show processlist;
2、可以在IDE工具中,链接数据库后,然后在命令模式执行 show processlist

一句 mysql#show processlist 引发的思想“革命”

先了解这些字段代表什么意思

Id:进程号
User:显示当前用户,如果不是root,这个命令就只显示你权限范围内的sql语句
Host:显示是哪个IP地址及哪个端口请求的语句;可以根据这些IP地址分析
db:请求哪个数据库
Command:显示当前连接的执行的命令,一般就是休眠(sleep),查询(query),连接(connect)
Time:此这个状态持续的时间,单位是秒
State:显示使用当前连接的sql语句的状态,很重要的列,state只是语句执行中的某一个状态,例如查询,需要经过copying to tmp table,Sorting result,Sending data等状态才可以完成
Info:显示这个sql语句,因为长度有限,所以长的sql语句就显示不全,但是一个判断问题语句的重要依据

那么会很多人有疑问,执行了这些命令,怎么根据这些命令来分析呢,下面带着这些疑问来详细分析几个重要字段指标。
Command字段:

休眠(sleep)造成很多 sleep 进程的可能原因有几个

1. 使用了太多持久连接(个人觉得,在高并发系统中,不适合使用持久连接)
2. 程序中,没有及时关闭mysql连接
3. 数据库查询不够优化,过度耗时。

但是当没有使用持久化链接模式和sql语句执行完之后,都关闭了mysql连接,但是会看到大量的sleep进程,当系统在高并发的时候,这个是一个很可怕的问题。因为大量的sleep进程导致到达了系统的最大连接数,造成很多用户在排队等待的状态,系统会直接被拖垮。

那是什么情况下会造成那么多的sleep进程在执行完后没有释放呢?又有什么办法处理这些问题呢?

造成这个问题的最主要因素就是 wait_timeout 参数的设置,默认值为 8小时 28800秒,就是sql语句在正常执行完后,需要等待 28800秒后,该进程才会被释放,在高并发的时候,这个参数是重要设置指标。大家可以针对系统和业务场景设置wait_timeout这个值。
如果没有权限或者特殊情况设置这个值,也可以在程序中,根据需要,order by time的时间大小来 kill 一些时间过长的进程释放掉。

Info 字段:
这个字段会看到 执行的sql语句,在结合 Command 和 Time 字段,分析这个语句是否存在问题,如果 Command 是 query 状态而 Time 的时间又很长,那就证明是一个问题sql,查询慢的sql,要进行优化。

相关推荐