前几天在看一个亿级的视频中谈到mysql
优化和解决的方案,其中说到一个命令 show processlist
,因为对这个命令也是基于工做经验的普通使用,并无深刻研究,因此忽然想深刻了解下这个命令的一些使用以及原理,因此整理下技术栈。mysql
那好,要理解及使用这个命令,首先就要弄清楚:
show processlist 是什么?
show processlist 字面意思就是,显示进程列表,这个列表最多显示100条纪录,要显示所有数据,使用show full processlist
。sql
show processlist 在何时使用?
这命令,不限制场景使用,可是使用频次最高的,莫过于数据库出现瓶颈的时候,须要分析数据,查看哪一个进程执行时间比较长,哪些进程一直没有执行完而释放。而后针对某些状况,把进程 kill 掉;杀掉进程的命令是:kill id(进程号)
。数据库
show processlist 怎么使用?
那不少人就会问,这个命令怎么使用,或者说,怎么分析这个命令的数据结果;
执行 show processlist 后,会出现相似如下结果并发
在哪里执行 show processlist 命令?
一、直接在命令行模式下执行
mysql# show processlist;
二、能够在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. 数据库查询不够优化,过分耗时。spa
可是当没有使用持久化连接模式和sql语句执行完以后,都关闭了mysql链接,可是会看到大量的sleep进程,当系统在高并发的时候,这个是一个很可怕的问题。由于大量的sleep进程致使到达了系统的最大链接数,形成不少用户在排队等待的状态,系统会直接被拖垮。命令行
那是什么状况下会形成那么多的sleep进程在执行完后没有释放呢?又有什么办法处理这些问题呢?
code
形成这个问题的最主要因素就是 wait_timeout
参数的设置,默认值为 8小时 28800秒
,就是sql语句在正常执行完后,须要等待 28800秒后,该进程才会被释放,在高并发的时候,这个参数是重要设置指标。你们能够针对系统和业务场景设置wait_timeout
这个值。
若是没有权限或者特殊状况设置这个值,也能够在程序中,根据须要,order by time的时间大小来 kill 一些时间过长的进程释放掉。
Info 字段:
这个字段会看到 执行的sql语句,在结合 Command 和 Time 字段,分析这个语句是否存在问题,若是 Command 是 query 状态而 Time 的时间又很长,那就证实是一个问题sql,查询慢的sql,要进行优化。