一句 mysql#show processlist 引发的思想“革命”
前几天在看一个亿级的视频中谈到mysql
优化和解决的方案,其中说到一个命令 show processlist
,由于对这个命令也是基于工作经验的普通使用,并没有深入研究,所以突然想深入了解下这个命令的一些使用以及原理,所以整理下技术栈。
那好,要理解及使用这个命令,首先就要弄清楚:
- show processlist 是什么命令?
- show processlist 在什么时候使用?
- show processlist 怎么使用?
- 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
先了解这些字段代表什么意思
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,要进行优化。