合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
## 一、连接数 ### **设置** 通过配置文件中的max_connections参数来设置; ### **监控** 查看允许的最大并发连接数: ``` show global variables like '%max_connections%'; ``` 查看线程相关的状态变量; ``` show status like 'Threads%'; ``` Threads_cached:缓存中的线程连接数,该变量在嵌入式服务器(libmysqld)无意义;当前线程缓存还有多少线程; Threads_connected:当前打开的连接数,该值和show full processlist;输出记录总数一样;当前已连接的MySQL线程数。这个值不会超过max_connections,也许会超过1或2个,不用管它; Threads_created:为处理连接而创建的线程数。如果该值很大,可能要增加thread_cache_size。缓存未命中率=Theads_created/Connections; Threads_running:非睡眠状态的连接数,通常指并发连接数;表示当前正在运行的连接数,这个数会远小于Threads_connected,这是正常情况; ## 二、进程分析 ``` show full processlist ``` 典型结果界面: ![](https://img.kancloud.cn/3b/99/3b998d6d53553620be7f508751b157d4_1075x379.png) >[danger] > 1、如果没有为普通用户赋予process权限,那么以该用户登录,在执行命令show full processlist的时候,只能看到该用户的执行进程,如果做了授权或以root登录,则可以看到全部的执行进程。 > 2、grant process on *.* to 'user'@'%'; > 如果发现持续耗时的进程,可以用kill结束; ``` mysql> kill ID 杀掉进程 ``` 如果是root帐号,你能看到所有用户的当前连接(thread)。如果是其它普通帐号,只能看到自己占用的连接; | 名称 | 说明 | | --- | --- | | id | 当前的标识,你要 kill 一个语句的时候,就需要用到这个id | | user | 当前进程所属的用户| | host | 当前进程是从哪个 ip 的哪个端口上连接过来的 | | db | 当前进程连接的是 哪个数据库 | | command | 当前连接的执行的命令,一般就是休眠( sleep ),查询( query ),连接( connect ) | | time | 当前进程当前状态持续的时间,单位是秒 | | state | 当前进程的 sql 语句的状态;state 只是语句执行中当前所处的某一个状态,一个 sql 语 句,以查询为例,可能需要经过 copying to tmp table , Sorting result , Sending data 等状态才 可以完成;具体的状态明细,参考下面的表格; | | info | 当前进程的具体sql 语 句 | ### **线程命令(Command)值** 仅列常见的,不常见的可以网上搜索,没必要这里列了; | **命令名** | **详细解释** | | :-: | :-: | | Query| 该线程正在执行一个语句。 | | Sleep | 线程正在等待客户端向其发送新的语句。| ### **线程状态(State)值** 仅列常见的,不常见的可以网上搜索,没必要这里列了; | **状态名** | **详细解释** | | :-: | :-: | | Copying to tmp table | 服务器正在复制磁盘到内存的临时表,是直接在磁盘创建的临时表而并非从内存转到磁盘的临时表。| | Sending data | 线程正在读取和处理SELECT语句的行,并将数据发送到客户端。由于在此状态期间发生的操作往往执行大量的磁盘访问(读取),所以在给定查询的整个生命周期内通常是最长的运行状态。| | Sorting result | 正在为 GROUP BY 做排序。 | | Sorting for order | 正在为 ORDER BY 做排序。 | ## 三、慢查询和长事务 ## **慢查询** 若有 Command 为 Query ,Time 很大的线程在列表中,那么这个线程就是在执行一个慢查询。Info 字段能看出来对应的 SQL ; ## **长事务** 可用下面的语句,找出长事务线程: ~~~sql select t.*,to_seconds(now())-to_seconds(t.trx_started) idle_time from INFORMATION_SCHEMA.INNODB_TRX t\G; ~~~ 查询结果中,idle_time 过大的事务就是长事务。输出结果中,`trx_mysql_thread_id`  是对应的线程标识;