请教一个sql执行时间很长,直到把数据库搞崩的问题?

问题背景: 这是查询一周之内nsv(衡量用户的满意度,值越小表示用户越不满意)比较差的query,reply等的一条sql,但是发现这条sql的在执行的一会后,数据库就挂了,报错too many connections, 使用show full processlist 命令查看sql的连接情况,结果感到很奇怪

select max(id), max(date), type, sum(like_pv), sum(trample_pv), (sum(like_pv) - sum(trample_pv))/(sum(like_pv) + sum(trample_pv)) as nsv,query, diff, '' as subtype, sum(total_pv) as total_pv, sum(total_uv),max(reply) as reply from domain_like_dislike where date >= 20220320 and date <= 20220327 and diff ='TOP_QUERY' group by query, type having nsv < 0.3 and type like 'VOICE%' order by total_pv desc

默认情况下mysql的max_connections为151,这个我也并没有修改,但是在执行这条sql的时候,执行show full processlist看到sql的连接数不断增加,而且出现了很多和上面sql完全无关的sql,而且连接数很快就达到了151,从而就出现了too many connections报错
如下图是执行show full processlist info一列的数据(很多sql和上面实际执行的sql无关,却为什么也在这个时候执行?)
image.pngimage.png
数据库大概有1000w条数据
image.png
而且使用explain关键字执行得到下面的结果
image.png
请教前辈们有没有什么办法来排查和解决这个问题?

阅读 1.3k
1 个回答

要确认是否真的有连接很简单,在跑 mysql 的机器上安装一个 tshark 抓包一下就好了,因为不用动 mysql

如果不想安装 tshark,就开启 mysqlgeneral_log ,这样需要修改 mysql server 的配置并重启 mysql server

参考:tshark 抓包 mysql 协议包

推荐问题
宣传栏