MySQL cpu飙升排查记录

mysql cpu占用率飙升问题排查

一开始我们就会想到慢sql

bash 复制代码
//开启
SET GLOBAL slow_query_log = 'ON';
//设置慢sql时间,单位秒
SET GLOBAL long_query_time = 1;
//确认是否生效
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';
//关闭(一般没出问题就会关闭,出了问题就开启排查,当然资源允许情况,可以一直开着)
SET GLOBAL slow_query_log = 'OFF';
//慢sql文件
SHOW VARIABLES LIKE 'slow_query_log_file'; 

永久生效就得改配置文件了,因为是排查问题,临时用一下就可以

如果没有发现慢sql记录,则需要换个思路,类似于程序while(true)执行,也是会导致cpu飙升的

bash 复制代码
//查看当前正在执行的查询
SHOW PROCESSLIST;

//查看线程状态
SELECT * FROM information_schema.PROCESSLIST WHERE COMMAND != 'Sleep';

//查询消耗cpu较高的sql
SELECT 
    digest_text, 
    COUNT_STAR AS exec_count, 
    SUM_TIMER_WAIT/1000000000000 AS total_time_s,
    AVG_TIMER_WAIT/1000000000000 AS avg_time_s
FROM 
    performance_schema.events_statements_summary_by_digest
ORDER BY 
    total_time_s DESC
LIMIT 10;

找到消耗cpu的sql,然后可以使用explain分析

比如我这边的sql,发现explain结果中type为ALL,代表着全表扫描

bash 复制代码
EXPLAIN SELECT COUNT(*) FROM `iot_device_alarm_safety_audit`
WHERE `device_id` = 123 AND `alarm_time` = '2024-05-01 12:00:00' AND `CODE` = 'ERROR';

全表扫描的话,表中记录一旦多起来,查询时间随之变大,加上查询频率一旦上去,则cpu就会上升

可以分析以下代码,是否有优化的点

bash 复制代码
//查询表中记录总数
select count(id) from iot_device_alarm_safety_audit;

定位到了问题,就容易解决了

比如创建索引:

CREATE INDEX idx_device_alarm_code ON iot_device_alarm_safety_audit (device_id, alarm_time, code);

相关推荐
treesforest18 分钟前
IP精准定位服务:从城市轮廓到街道坐标,技术如何重塑空间感知
网络·数据库·网络协议·tcp/ip·ip
大明者省20 分钟前
宝塔开了端口,Ubuntu 还得开相应端口才能打通
服务器·数据库·ubuntu
Teable任意门互动1 小时前
AI原生开源多维表格有哪些?主流开源多维表格对比解析
数据库·开源·excel·钉钉·飞书·开源软件·ai-native
TDengine (老段)2 小时前
MNode 内部机制深度解析 — SDB、事务引擎与 DDL 处理全链路
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
这个DBA有点耶2 小时前
数据库上云 vs 自建:从成本到人力的三维对比与决策框架
数据库·经验分享·sql·创业创新·dba
shizhan_cloud2 小时前
MySQL 索引优化 + 慢查询日志
数据库·mysql
Drache_long2 小时前
MySQL数据库(故障排除)
数据库·mysql
2303_821287382 小时前
如何清洗SQL输入数据_使用框架内置的ORM处理数据交互
jvm·数据库·python
清风雅雨2 小时前
AI编程:OA流程明细表中多个金额字段由整数改为2位小数
数据库·ai编程
菜鸟上路_lbz2 小时前
sqlserver存储过程查询缓慢锁表分析
数据库·sqlserver