MySQL调优学习-快速获取占用CPU较高的SQL语句

发布时间 2023-11-18 09:35:41作者: 济南小老虎

MySQL调优学习-快速获取占用CPU较高的SQL语句


背景

早上突然发现一个MySQL数据库的CPU使用率居高
因为是一个混布的环境上面还有一个redis
怕影响业务就上去像查看一下具体是何种原因导致的速度慢
因为实发突然,并没有mysql em 等工具
所以从网上学到了一个方法进行简单学习与验证. 

https://blog.csdn.net/qq_28721869/article/details/115820752

学习过程

ssh 到高CPU的数据库服务器

top 输入 P 查看最高的是MySQL的进程. 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
1644407 mysql     20   0   26.3g  14.6g  39872 S 399.0  64.7   2693:35 mysqld

然后输入 PID为第一步查询出来的PID信息
top -Hp 1644407

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
2066704 mysql     20   0   26.3g  14.6g  39872 R  20.3  64.6   7:21.32 connection
2066836 mysql     20   0   26.3g  14.6g  39872 R  20.3  64.6   7:41.53 connection
1884703 mysql     20   0   26.3g  14.6g  39872 R  20.0  64.6  20:22.51 connection
2029584 mysql     20   0   26.3g  14.6g  39872 R  20.0  64.6   7:21.81 connection
2039926 mysql     20   0   26.3g  14.6g  39872 R  20.0  64.6   7:19.38 connection
2044950 mysql     20   0   26.3g  14.6g  39872 R  20.0  64.6   7:21.09 connection
2045032 mysql     20   0   26.3g  14.6g  39872 R  20.0  64.6   7:41.30 connection
2066656 mysql     20   0   26.3g  14.6g  39872 R  20.0  64.6   7:38.89 connection
2066713 mysql     20   0   26.3g  14.6g  39872 R  20.0  64.6   7:40.71 connection
2066803 mysql     20   0   26.3g  14.6g  39872 R  20.0  64.6   7:21.77 connection
2078251 mysql     20   0   26.3g  14.6g  39872 R  20.0  64.6   7:30.40 connection
2078880 mysql     20   0   26.3g  14.6g  39872 R  20.0  64.6   7:19.57 connection
1883812 mysql     20   0   26.3g  14.6g  39872 R  19.7  64.6  13:26.13 connection

因为平均CPU使用率是 20% 所以充分怀疑进程已经至少存在了 30个小时左右 

可以使用 sar -f /var/log/sa/sa01 的方式查看CPU的近期使用率. 

根据pid 查看具体的 SQL语句

将pid 保存进 1.txt 然后使用如下方式进行处理. 
for i in `cat 1.txt` ; do echo -n "$i ,"; done

执行SQL为:

SELECT
	b.HOST,
	b.db,
	b.USER,
	a.THREAD_OS_ID "os_id",
	b.id "processlist_id",
	b.command,
	b.time,
	b.state,
	a.PROCESSLIST_INFO,
	b.info "sql" 
FROM
	PERFORMANCE_SCHEMA.threads a,
	information_schema.PROCESSLIST b 
WHERE
	b.id = a.processlist_id 
	AND a.THREAD_OS_ID in (2066704 ,2066836)

查询效果为

image


查看进程开始的时间

ps -T -eo pid,tid,lstart,etime,cmd  |grep $threadid |grep -v grep 

需要注意 ps 默认不显示  thread 信息. 只显示 prcess的信息
需要增加 -T 参数,并且选择 tid 才会将 threads的信息展示出来进行查询

比如我这边这个的显示信息为:
1644407 2066704 Wed Nov  1 09:09:00 2023  1-00:19:11 

MySQL其他学习

在作者的其他blog上面看到了 myawr工具
计划近期有时间学习一下相关内容.