MySQL服务器进程CPU占用100%的解决方法_Mysql

朋友主机(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% 的经验总结

  1. 增加 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.

  2. 对 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 数据表设计的时候,一定要通盘考虑清楚。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索mysql
cpu
mysql进程占用cpu过高、服务器内存占用过高、服务器80端口被占用、服务器端口被占用、linux 查看服务器进程,以便于您获取更多的相关知识。

时间: 2024-09-22 04:25:52

MySQL服务器进程CPU占用100%的解决方法_Mysql的相关文章

电脑进程CPU占用100%如何解决

  CPU使用率高的原因 1.电脑运行了大型的程序,例如大型的游戏,3D网络游戏等等,这种情况通常是正常的,这类程序需要较多的CPU资源,网友将大型的程序退出一段时间,CPU使用率基本上就恢复正常了; 2.电脑如果中毒,例如下载者类的病毒,这类病毒会在后台下载大量的恶意程序运行,试想一下,电脑突然运行了几十个程序,CPU使用率必然会突然飙升,用户会觉得很卡.这种情况就需要大家下载杀毒软件或者木马专杀工具进行扫描,清除完病毒.木马之后CPU使用率就会降低了; 3.CPU资源被浏览器占用导致CPU使

SVCHOST进程CPU占用高的解决方法

VCHOST是Windows中最神秘的进程,很多新用户对它很不解.它是Windows的服务宿主,很多系统自带的服务通过它来运行.简单的比喻,它相当于系统服务的马甲.但是SVCHOST有时候CPU占用会非常高,如何看透它的马甲找出真凶呢?我们通过任务管理器来找出它的元凶. STEP01进入"任务管理器":在任务栏的空白处点击右键,选择"任务管理器"以打开任务管理器→进入"进程"选项卡.也可以按下Ctrl+Shift+ESC组合键打开任务管理器.Wi

MySQL CPU 占用 100% 的解决过程

MySQL CPU 占用 100% 的解决过程 服务器解决了 MySQL CPU 占用 100% 的问题,稍整理如下,希望对各位有所帮助. 朋友主机 (. MySQL CPU 占用 100% 的解决过程 今天早上仔细检查了一下.目前此网站的七日平均日 IP 为2000,PageView 为 3万左右.网站A 用的 database 目前有39个表,记录数 60.1万条,占空间 45MB.按这个数据,MySQL 不可能占用这么高的资源. 于是在服务器上运行命令,将 MySQL 当前的环境变量输出到

Windows Server 2008运行斗地主CPU占用100%的解决办法

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   开启server2008桌面体验后,在VISTA主题下,QQ斗地主游戏CPU占用100%,(采用经典主题时QQ斗地主游戏CPU占用正常,但在斗地主的同时启用酷我音乐盒或酷狗音乐后,CPU占用同样达到100%). 受安装酷我音乐盒提示"必须安装WINDOWS PLAYER9或以上版本"的启示,可能是2008的windows player安装功能

分享CPU使用率100%的解决方法【图】

在开启一些游戏或者大型软件的时候,CPU使用率很容易达到100%,导致电脑运行速度很慢,甚至出现卡机,假死,蓝屏等状况,那么CPU使用率100%是什么原因造成的呢?CPU使用率100%怎么解决呢?     CPU使用率100%的几种可能: 1.CPU型号老旧,处理能力差; 有的电脑开十几个网页就会出现假死,这是因为现在网页中一般含有大量flash或者js代码,这些东西看上去没有多大,但是跟图片或者文字相比,需要数倍甚至十几倍的计算量,会占用大量CPU资源. 2.开启的软件过多,尤其是大型软件,例

NT Kernel & System 进程CPU占用过高问题解决方法

最近电脑突然出现顿卡顿卡的现象,查看进程管理,发现有一个System的进程一直占用CPU 50%,并且开机便如此. 针对这个问题我在网上查了很多资料,大部分都说系统该清理啦或者巴拉巴拉之类的电脑小白解决办法,都是复制粘贴的,看到老外写了一篇关于NT Kernel & System 进程CPU占用过高问题文章分析,我觉得分析的还是很好的,只可惜我最终发现我的问题并非出现在驱动上面(之前一直在这个误区里面走了好久,驱动装了卸了装,折腾不息). 好了,背景介绍到这里,下面说下我的问题是怎么解决的: 首

mysql安装时出现各种常见问题的解决方法_Mysql

小编为大家整理许多mysql安装时出现各种常见问题的解决方法,供大家参考,具体内容如下 问题一: 当各位在安装.重装时出现could not start the service mysql error:0原因: 卸载mysql时并没有完全删除相关文件和服务,需要手动清除. 安装到最后一步execute时不能启动服务的解决方法: 首先,在管理工具->服务里面将MySQL的服务给停止(有的是没有安装成功,有这个服务,但是已经停止了的),win+R->cmd,打开命令提示符窗口,输入命令:sc de

MySql 修改密码后的错误快速解决方法_Mysql

设置好密码后,使用数据库时出现如下错误: ERROR 1820 (HY000): You must reset your password using ALTER USER statement befo re executing this statement. You must SET PASSWORD before executing this statement的解决方法 今天在MySql5.6操作时报错:You must SET PASSWORD before executing this

共享:CPU资源占用100%解决方法

解决 1.驱动没有经过认证,造成CPU资源占用100%.大量的测试版的驱动在网上泛滥,造成了难以发现的故障原因. 2.防.杀毒软件造成故障.由于一些防.杀毒软加入了对网页.插件.邮件的随机监控,无疑增大了系统负担,可以根据情况有选择的开启服务. 3.病毒.木马造成.大量的蠕虫病毒在系统内部迅速复制,造成CPU占用资源率据高不下.解决办法:使用最新的杀毒软件在DOS模式下进行杀毒.经常性更新升级杀毒软件和防火墙,加强防毒意识,掌握正确的防杀毒知识. 4.开始->运行->msconfig->