通过以前对mysql的操作经验,先将mysql的配置问题排除了,查看msyql是否运行正常,通过查看mysql data目录里面的*.err文件(将扩展名改为.txt)记事本查看即可。如果过大不建议用记事本了,容易死掉,可以用editplus等工具

简单的分为下面几个步骤来解决这个问题:

1、mysql运行正常,也有可能是同步设置问题导致

2、如果mysql运行正常,那就是php的一些sql语句导致问题发现,用root用户进入mysql管理

mysql -u root -p

输入密码

mysql:show processlist 语句,查找负荷最重的 SQL 语句,优化该SQL,比如适当建立某字段的索引。

通过这个命令我看到原来是有人恶意刷搜索,因为dedecms搜索后面调用搜索最高的词,导致很多人用工具刷这个,而且是定时有间隔的,所以将这个php程序改名跳转都方法解决了。

当然如果你的确实是sql语句用了大量的group by等语句,union联合查询等肯定会将mysql的占用率提高。所以就需要优化sql语句,网站尽量生成静态的,一般4W ip的静态网站,mysql占用率几乎为0的。所以这对于程序员的经验是个考虑。尽量提高mysql性能 。

下面是脚本之家收集的文章,大家都可以参考下

MYSQL CPU 占用 100% 的现象描述

早上帮朋友一台服务器解决了 Mysql cpu 占用 100% 的问题。稍整理了一下,将经验记录在这篇文章里

朋友主机(Windows 2003 + IIS + PHP + MYSQL )近来 MySQL 服务进程 (mysqld-nt.exe) CPU 占用率总为 100% 高居不下。此主机有10个左右的 database, 分别给十个网站调用。据朋友测试,导致 mysqld-nt.exe cpu 占用奇高的是网站A,一旦在 IIS 中将此网站停止服务,CPU 占用就降下来了。一启用,则马上上升。

MYSQL CPU 占用 100% 的解决过程

今天早上仔细检查了一下。目前此网站的七日平均日 IP 为2000,PageView 为 3万左右。网站A 用的 database 目前有39个表,记录数 60.1万条,占空间 45MB。按这个数据,MySQL 不可能占用这么高的资源。

于是在服务器上运行命令,将 mysql 当前的环境变量输出到文件 output.txt:

d:\web\mysql> mysqld.exe --help >output.txt

发现 tmp_table_size 的值是默认的 32M,于是修改 My.ini, 将 tmp_table_size 赋值到 200M:

d:\web\mysql> notepad c:\windows\my.ini

[mysqld]

tmp_table_size=200M

然后重启 MySQL 服务。CPU 占用有轻微下降,以前的CPU 占用波形图是 100% 一根直线,现在则在 97%~100%之间起伏。这表明调整 tmp_table_size 参数对 MYSQL 性能提升有改善作用。但问题还没有完全解决。

于是进入 mysql 的 shell 命令行,调用 show processlist, 查看当前 mysql 使用频繁的 sql 语句:

mysql> show processlist;

反复调用此命令,发现网站 A 的两个 SQL 语句经常在 process list 中出现,其语法如下:

SELECT t1.pid, t2.userid, t3.count, t1.date

FROM _mydata AS t1

LEFT JOIN _myuser AS t3 ON t1.userid=t3.userid

LEFT JOIN _mydata_body AS t2 ON t1.pid=t3.pid

ORDER BY t1.pid

LIMIT 0,15

调用 show columns 检查这三个表的结构 :

mysql> show columns from _myuser;

mysql> show columns from _mydata;

mysql> show columns from _mydata_body;

终于发现了问题所在:_mydata 表,只根据 pid 建立了一个 primary key,但并没有为 userid 建立索引。而在这个 SQL 语句的第一个 LEFT JOIN ON 子句中:

LEFT JOIN _myuser AS t3 ON t1.userid=t3.userid

_mydata 的 userid 被参与了条件比较运算。于是我为给 _mydata 表根据字段 userid 建立了一个索引:

mysql> ALTER TABLE `_mydata` ADD INDEX ( `userid` )

建立此索引之后,CPU 马上降到了 80% 左右。看到找到了问题所在,于是检查另一个反复出现在 show processlist 中的 sql 语句:

SELECT COUNT(*)

FROM _mydata AS t1, _mydata_key AS t2

WHERE t1.pid=t2.pid and t2.keywords = '孔雀'

经检查 _mydata_key 表的结构,发现它只为 pid 建了了 primary key, 没有为 keywords 建立 index。_mydata_key 目前有 33 万条记录,在没有索引的情况下对33万条记录进行文本检索匹配,不耗费大量的 cpu 时间才怪。看来就是针对这个表的检索出问题了。于是同样为 _mydata_key 表根据字段 keywords 加上索引:

mysql> ALTER TABLE `_mydata_key` ADD INDEX ( `keywords` )

建立此索引之后,CPU立刻降了下来,在 50%~70%之间震荡。

再次调用 show prosslist,网站A 的sql 调用就很少出现在结果列表中了。但发现此主机运行了几个 Discuz 的论坛程序, Discuz 论坛的好几个表也存在着这个问题。于是顺手一并解决,cpu占用再次降下来了。(2007.07.09 附注:关于 discuz 论坛的具体优化过程,我后来另写了一篇文章,详见:千万级记录的 Discuz! 论坛导致 MySQL CPU 100% 的 优化笔记 http://www.xiaohui.com/dev/server/20070701-discuz-mysql-cpu-100-optimize.htm)

解决 MYSQL CPU 占用 100% 的经验总结

增加 tmp_table_size 值。mysql 的配置文件中,tmp_table_size 的默认大小是 32M。如果一张临时表超出该大小,MySQL产生一个 The table tbl_name is full 形式的错误,如果你做很多高级 GROUP BY 查询,增加 tmp_table_size 值。 这是 mysql 官方关于此选项的解释:

tmp_table_size

This variable determines the maximum size for a temporary table in memory. If the table becomes too large, a MYISAM table is created on disk. Try to avoid temporary tables by optimizing the queries where possible, but where this is not possible, try to ensure temporary tables are always stored in memory. Watching the processlist for queries with temporary tables that take too long to resolve can give you an early warning that tmp_table_size needs to be upped. Be aware that memory is also allocated per-thread. An example where upping this worked for more was a server where I upped this from 32MB (the default) to 64MB with immediate effect. The quicker resolution of queries resulted in less threads being active at any one time, with all-round benefits for the server, and available memory.

对 WHERE, JOIN, MAX(), MIN(), ORDER BY 等子句中的条件判断中用到的字段,应该根据其建立索引 INDEX。索引被用来快速找出在一个列上用一特定值的行。没有索引,MySQL不得不首先以第一条记录开始并然后读完整个表直到它找出相关的行。表越大,花费时间越多。如果表对于查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要考虑所有数据。如果一个表有1000行,这比顺序读取至少快100倍。所有的MySQL索引(PRIMARY、UNIQUE和INDEX)在B树中存储。

根据 mysql 的开发文档:

索引 index 用于:

快速找出匹配一个WHERE子句的行

当执行联结(JOIN)时,从其他表检索行。

对特定的索引列找出MAX()或MIN()值

如果排序或分组在一个可用键的最左面前缀上进行(例如,ORDER BY key_part_1,key_part_2),排序或分组一个表。如果所有键值部分跟随DESC,键以倒序被读取。

在一些情况中,一个查询能被优化来检索值,不用咨询数据文件。如果对某些表的所有使用的列是数字型的并且构成某些键的最左面前缀,为了更快,值可以从索引树被检索出来。

假定你发出下列SELECT语句:

mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;

如果一个多列索引存在于col1和col2上,适当的行可以直接被取出。如果分开的单行列索引存在于col1和col2上,优化器试图通过决定哪个索引将找到更少的行并来找出更具限制性的索引并且使用该索引取行。

开发人员做 SQL 数据表设计的时候,一定要通盘考虑清楚。

PHP技术交流QQ群:422137578

除非注明,文章均为 PHP二次开发 原创,转载请注明本文地址:http://www.php2.cc/article-2629-1.html

php mysql cpu使用率_Mysql CPU占用高的问题解决方法小结相关推荐

  1. Mysql CPU占用高的问题解决方法小结

    Mysql CPU占用高的问题解决方法小结 参考文章: (1)Mysql CPU占用高的问题解决方法小结 (2)https://www.cnblogs.com/shuaiandjun/p/566204 ...

  2. 1、cpu平均负载和cpu使用率 排查cpu使用高问题

    自定义标题 1. CPU 2. CPU 使用率 3. 测试: 4. 总结 1. CPU cpu平均负载 uptime 或 top 查看 cpu 平均负载(平均负载是指单位时间内,系统处于可运行状态和不 ...

  3. cpu占用高 本地服务器,win10系统服务主机本地系统cpu占用高的解决方法

    很多小伙伴都遇到过win10系统服务主机本地系统cpu占用高的困惑吧,一些朋友看过网上零散的win10系统服务主机本地系统cpu占用高的处理方法,并没有完完全全明白win10系统服务主机本地系统cpu ...

  4. win7计算机内存占用高,win7系统内存占用高的解决方法

    我们在操作win7系统电脑的时候,常常会遇到win7系统内存占用高的困惑吧,一些朋友看过网上零散的win7系统内存占用高的处理方法,并没有完完全全明白win7系统内存占用高是如何解决的,今天小编准备了 ...

  5. mysql cpu使用率100_Mysql CPU使用率长期100%的解决思路备忘

    最近一台服务器的CPU使用率长期保持在100%的状态,查看进程发现是Mysql服务导致的.于是搜索各方资料,终于成功解决问题.备忘以及分享一下,希望可以帮助各位新手朋友. (服务器运行环境是Windo ...

  6. Linux服务器如何查看CPU使用率、内存占用情况

    作为Linux运维工程师系统维护过程中,需要我们经常查看服务器CPU使用率.内存使用率.带宽占用,从资源使用的程度分析系统整体的运行情况. 在 Linux 香港服务器上查看资源使用情况有很多命令可以参 ...

  7. mysql 内存监控_mysql cpu和内存监控

    mysqlMem 监控: #!/bin/bash Pid=`/bin/ps -ef|grep mysqld|grep -Ev "grep|safe"|awk '{print $2} ...

  8. c# 获取所有的进程的cpu使用率_Linux CPU使用率很高,但为啥却找不到高CPU的进程

    案例分析 你的准备 今天依旧探究系统CPU使⽤率⾼的情况,所以这次实验的准备⼯作,与上节课的准备⼯作基本相同,差别在于案例所⽤的Docker 镜像不同. 本次还是基于 Ubuntu 18.04,同样适 ...

  9. CPU使用率和CPU负载的区别

    1.CPU使用率 CPU使用率指的是程序在运行期间实时占用的CPU百分比,这是对一个时间段内CPU使用状况的统计.通过这个指标可以看出在某一个时间段内CPU被占用的情况. 2.cpu负载 2.1 lo ...

  10. mysql性能瓶颈分析和内存占用高的优化

    微信公众号:我其实目前没有耶 我是一个互联网公司的螺丝钉; 魔术师耿 mysql服务器性能瓶颈分析和内存优化 前言 开发阶段,对项目中mysql使用在代码层面已经做了最大努力的优化: 大表减少关联查询 ...

最新文章

  1. IE调试网页之一:F12 开发人员工具简介
  2. C#调用系统默认打印机打印文字和图片
  3. 【关于重载OnBackPressed无效的解决方案】
  4. nginx的master和worker进程间的通信
  5. QT的QGraphicsPathItem类的使用
  6. 小程序提供几种结算周期? T+1是什么意思?
  7. zynq网络时钟控制寄存器_ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断...
  8. 最好的Java开发人员测试和集成工具
  9. 深度学习的实用层面 —— 1.14 关于梯度检验实现的标记
  10. vscode写python爬虫_如何在vscode中调试python scrapy爬虫
  11. EDA鸿蒙是不是,如果华为不强研鸿蒙,和阿里合作,新系统或早用到手机上了? - 区块网...
  12. OpenCV图像处理(14)—— 图像转视频
  13. yii2设置session时间_YII2 设置session过期时间
  14. arduino入门(一)arduino下载安装,炒鸡详解
  15. SQLserver2019找不到配置管理工具解决办法
  16. 我的游戏测试面试过程
  17. 【快递100】 物流公司对应编码分享(截止到2021-09-19 最新数据)
  18. octobercms mysql_如何在Ubuntu 16.04 LTS上安装OctoberCMS
  19. 业务流程管理工具的概览和比较分析
  20. React Native 实践之携程 Moles 框架

热门文章

  1. ES6-模块导入导出
  2. 第五节、矩阵分解之LU分解
  3. Google的21道面试问题
  4. python 云计算开发是什么_云计算是什么?云计算开发学习路线
  5. 修改手机屏幕刷新率_今年买手机绕不开高刷新率屏幕,144Hz比120Hz更好吗?
  6. 拓端tecdat|R语言在地图上绘制月亮图、饼状图数据可视化果蝇基因种群
  7. 拓端tecdat|基于模型的聚类和R语言中的高斯混合模型
  8. 3. 请列举java ee的主要新特性_JavaEE考试题
  9. face_recognition基础接口
  10. 计算机视觉测试数据集