当我们查看mysql的链接数的时候,会使用命令show full processlist; ,但是当链接非常多的时候,就不好看了,有时候我们只想看到那些ip的链接数最大,以便于定位出问题的程序,此时上面的命令就不够用了,我遇到此问题时,再网上了翻了很多,没有发现有这方面的解决文章,于是参考mysql文档,自己研究了下,写出此文,方便他人参考。
首先,启动mysql,如果有 SUPER 权限,则可以看到全部的线程,否则,只能看到自己发起的线程(这是指,当前对应的MySQL帐户运行的线程)。
我想要的结果就是根据ip来分组统计ip的mysql连接数,sql查询语句如下,
SELECT USER,SUBSTRING_INDEX(HOST,':',1) AS IP,COUNT(1) AS Total FROM INFORMATION_SCHEMA.PROCESSLIST GROUP BY IP ORDER BY Total DESC;
对此sql语句说明下,SUBSTRING_INDEX()函数是根据分隔符分割字符串维数组,第一个参数是要操作的字段,第二个参数是字段里字符串的分割符号,因为我使用到的HOST字段字符串为172.31.30.72:38969 ,所以分隔符为':',第3个参数,是要取的分割后数组的索引,为正数从左边取,然后根据IP分组。
show full processlist; 的内容是从INFORMATION_SCHEMA.PROCESSLIST表里取得的。这两句是等价的,
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST
SHOW FULL PROCESSLIST
所以使用INFORMATION_SCHEMA.PROCESSLIST表,用sql语句来查询,更为灵活。
参考,
https://dev.mysql.com/doc/refman/5.7/en/processlist-table.html