xiaoming728

xiaoming728

MySQL占用CPU超过100%解决过程

2023-12-11
MySQL占用CPU超过100%解决过程

来源:CSDN-jimshen

日期:2017-12-04 09:58:38

链接:https://blog.csdn.net/jimshen/article/details/78706538

2017年12月2日上午,将学校新闻网2015年之前的45000多条记录迁移到了新网站的mysql数据库,新网站上有2015年1月1日之后的9000多条记录,数据量一下子增加了5倍。
2017年12月3日晚上9点多,有领导和老师反映新闻网无法访问,立即登录服务器进行排查。

一、使用top命令看到的情况如下

可以看到服务器负载很高,mysql CPU使用已达到接近400%(因为是四核,所以会有超过100%的情况)。

二、查看正在执行的语句

在服务器上执行mysql -u root -p之后,输入show full processlist; 可以看到正在执行的语句。

可以看到是下面的SQL语句执行耗费了较长时间。

SELECT id,title,most_top,view_count,posttime FROM article 
where status=3 AND catalog_id in (select catalog_id from catalog where catalog_id=17 or parent_id=17)  
order by most_top desc,posttime desc limit 0,8

直接执行此条SQL,发现速度很慢,需要1-6秒的时间(跟mysql正在并发执行的查询有关,如果没有并发的,需要1秒多)。

三、通过EXPLAIN分析SQL语句

EXPLAIN SELECT id,title,most_top,view_count,posttime FROM article 
where status=3 AND catalog_id in (select catalog_id from catalog where catalog_id=17 or parent_id=17)  
order by most_top desc,posttime desc limit 0,8

可以看到,主select对27928条记录使用filesort进行了排序,这是造成查询速度慢的原因。然后8个并发的查询使CPU专用很高。至此对SQL进行优化,缩减查询范围,修改排序规则。

四、优化效果

查询时间大幅度缩短,CPU负载很轻

五、思考总结

通过这个问题,数据库在大数量下对查询、更新等耗时成比例增加,造成整体服务访问变慢,针对这种情况,可以通过此方法排查问题,找到访问变慢的根源。