mysql占用CPU超过100%的详细解决过程

 更新时间:2023年10月22日 15:03:56   作者:jimshen  
前段时间我的一个网站经常打不开,通过检查发现服务器cpu占用超过100%,通过top命令发现是mysql占用cpu特别高导致的,下面这篇文章主要给大家介绍了关于mysql占用CPU超过100%的详细解决过程,需要的朋友可以参考下

一、使用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语句似乎没有优化的空间。
直接执行此条SQL,发现速度很慢,需要1-6秒的时间(跟mysql正在并发执行的查询有关,如果没有并发的,需要1秒多)。如果把排序依据改为一个,则查询时间可以缩短至0.01秒(most_top)或者0.001秒(posttime)。

三、修改mysql配置文件中的pool/buffer等数值,重启mysql都没有作用。

四、通过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专用很高。

五、优化

首先是缩减查询范围

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)  and DATEDIFF(NOW(),posttime)<=90
order by most_top desc,posttime desc limit 0,8

发现有一定效果,但效果不明显,原因是每条记录都要做一次DATEDIFF运算。后改为

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)  and postime>='2017-09-05'
order by most_top desc,posttime desc limit 0,8

查询速度大幅提高。在PHP中,日期阈值通过计算得到

$d = date("Y-m-d", strtotime('-90 day'));
$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)  and postime>='$d'
order by most_top desc,posttime desc limit 0,8
"

六、效果

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

以上就是mysql占用CPU超过100%的详细解决过程的详细内容,更多关于mysql占用CPU超过100%的资料请关注脚本之家其它相关文章!

相关文章

  • Mysql中的几种常见日志小结

    Mysql中的几种常见日志小结

    本文主要介绍了Mysql中的几种常见日志小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • Mysql数据库的增删改查、备份、还原等基本操作大全

    Mysql数据库的增删改查、备份、还原等基本操作大全

    这篇文章主要介绍了Mysql数据库的增删改查、备份、还原等基本操作,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • mysql 关键词相关度排序方法详细示例分析

    mysql 关键词相关度排序方法详细示例分析

    以下是对mysql关键词相关度排序方法进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-08-08
  • Mac 安装 mysqlclient过程解析

    Mac 安装 mysqlclient过程解析

    这篇文章主要介绍了Mac 安装 mysqlclient过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Centos6.4编译安装mysql 8.0.0 详细教程

    Centos6.4编译安装mysql 8.0.0 详细教程

    这篇文章主要为大家分享了Centos6.4编译安装mysql 8.0.0 详细教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • mysql建立自定义函数的问题

    mysql建立自定义函数的问题

    由于这几天在写mysql存储过程且发现程序体积越来越庞大,于是尝试使用mysql的函数
    2011-04-04
  • MySQL过滤数据操作方法梳理

    MySQL过滤数据操作方法梳理

    数据库表一般包含大量的数据,很少需要检索表中的所有行。通常只是根据特定的需要提取表数据的子集。因此检索所需数据时需要指定搜索条件,搜索条件也称为过滤条件
    2022-10-10
  • 修改Mysql索引长度限制解决767 byte限制问题

    修改Mysql索引长度限制解决767 byte限制问题

    这篇文章主要介绍了修改Mysql索引长度限制解决767 byte限制问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • MySQL InnoDB索引原理分析和算法解密

    MySQL InnoDB索引原理分析和算法解密

    InnoDB索引需平衡数量以优化性能,支持哈希、B+树和全文索引,哈希适用于等值查询,B+树高效处理范围查找,全文索引用于文本检索但受限于语言和字符集
    2025-07-07
  • Mysql中distinct与group by的去重方面的区别

    Mysql中distinct与group by的去重方面的区别

    distinct简单来说就是用来去重的,而group by的设计目的则是用来聚合统计的,两者在能够实现的功能上有些相同之处,但应该仔细区分,因为用错场景的话,效率相差可以倍计。
    2020-03-03

最新评论