当前位置: 代码网 > it编程>数据库>Mysql > MySQL定位CPU利用率过高的SQL方法

MySQL定位CPU利用率过高的SQL方法

2024年07月04日 Mysql 我要评论
前言当mysql cpu告警利用率过高的时候,我们应该怎么定位是哪些sql导致的呢,本文将介绍一下定位的方法。本文所使用的方法,前提是你可以登录到mysql所在的服务器,执行命令查看进程,当然让数据库

前言

当mysql cpu告警利用率过高的时候,我们应该怎么定位是哪些sql导致的呢,本文将介绍一下定位的方法。

本文所使用的方法,前提是你可以登录到mysql所在的服务器,执行命令查看进程,当然让数据库管理员登录执行也可以。但如果无法或无权限去服务器上执行命令,本方法将不适合定位问题。

一.获取mysql的服务器进程号

登陆mysql所在的linux服务器,执行命令:top,在command列找到mysqld,并且%cpu使用率高的,比如数值超过100的,获取pid号。

pid user      pr  ni    virt    res    shr s  %cpu %mem     time+ command
32232 root      20   0 1443252 356688  11748 s 107.0  4.4   2:03.82 mysqld     

上述例子中,32232mysql进程id,接下来再用它查询出占用cpu多的线程。

二.查询进程中的线程

使用命令:top -h -p <mysqld 进程 id>,查询线程号:

本例中使用命令top -h -p 32232

pid user      pr  ni    virt    res    shr s %cpu %mem     time+ command                                                                               
32272 root      20   0 1443252 356688  11748 r 99.7  4.4   2:25.74 mysqld 

其中pid 32272为线程id号。

三.根据线程id去mysql查询出对应的sql

select a.user,a.host,a.db,b.thread_os_id,b.thread_id,a.id processlist_id,a.command,a.time,a.state,a.info from information_schema.processlist a,performance_schema.threads b where a.id = b.processlist_id and b.thread_os_id=32272;

查询结果:

| user     | host      | db   | thread_os_id | thread_id | processlist_id | command | time | state        | info                                        |
+----------+-----------+------+--------------+-----------+----------------+---------+------+--------------+---------------------------------------------+
| msandbox | localhost | test |        32272 |        32 |              7 | query   |    2 | sending data | select * from t_abc order by rand() limit 1 |
+----------+-----------+------+--------------+-----------+----------------+---------+------+--------------+---------------------------------------------+

其中,info列显示的sql就是占用cpu较大的sql,针对其进行优化即可。

此外,还可以通过下列sql,查询下线程的其他信息,方便进一步优化:

 select * from performance_schema.events_statements_current where thread_id in (select thread_id from performance_schema.threads where thread_os_id = 32272)

通过这个结果我们可以查看具体的 sql,看到有使用临时表、使用了排序等信息。
查询结果节选:

created_tmp_disk_tables: 1  
created_tmp_tables: 1  
sort_rows: 1  
sort_scan: 1  

总结:

本文介绍了一种登陆mysql服务器,定位cpu利用率过高的sql的方法,可以使用此方法,快速的定位到正在数据库里抽大烟的sql,kill掉进程,并且优化sql后即可解决。此方法一定要在cpu告警时使用,如果cpu已经恢复正常了,则无法使用此方法查询了。

以上就是mysql定位cpu利用率过高的sql方法的详细内容,更多关于mysql定位sql的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com