早上帮朋友一台服务器解决了 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:
发现 tmp_table_size 的值是默认的 32M,于是修改 My.ini,将 tmp_table_size 赋值到 200M:d:webMysqL> MysqLd.exe --help >output.txt
然后重启 MysqL 服务。cpu 占用有轻微下降,以前的cpu 占用波形图是 100% 一根直线,现在则在 97%~100%之间起伏。这表明调整 tmp_table_size 参数对 MysqL 性能提升有改善作用。但问题还没有完全解决。d:webMysqL> notepad c:windowsmy.ini
[MysqLd]
tmp_table_size=200M
于是进入 MysqL 的 shell 命令行,调用 show processList,查看当前 MysqL 使用频繁的 sql 语句:
反复调用此命令,发现网站 A 的两个 sql 语句经常在 process List 中出现,其语法如下:MysqL> show processList;
调用 show columns 检查这三个表的结构 :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
终于发现了问题所在:_mydata 表,只根据 pID 建立了一个 primary key,但并没有为 userID 建立索引。而在这个 sql 语句的第一个left JOIN ON 子句中:MysqL> show columns from _myuser;
MysqL> show columns from _mydata;
MysqL> show columns from _mydata_body;
left JOIN _myuser AS t3 ON t1.userID=t3.userID
_mydata 的 userID 被参与了条件比较运算。于是我为给 _mydata 表根据字段 userID 建立了一个索引:
建立此索引之后,cpu 马上降到了 80% 左右。看到找到了问题所在,于是检查另一个反复出现在 show processList 中的 sql 语句:MysqL> ALTER table `_mydata` ADD INDEX ( `userID` )
经检查 _mydata_key 表的结构,发现它只为 pID 建了了 primary key,没有为 keywords 建立 index。_mydata_key 目前有 33 万条记录,在没有索引的情况下对33万条记录进行文本检索匹配,不耗费大量的 cpu 时间才怪。看来就是针对这个表的检索出问题了。于是同样为 _mydata_key 表根据字段 keywords 加上索引:SELECT COUNT(*)
FROM _mydata AS t1,_mydata_key AS t2
WHERE t1.pID=t2.pID and t2.keywords = '孔雀'
MysqL> ALTER table `_mydata_key` ADD INDEX ( `keywords` )
建立此索引之后,cpu立刻降了下来,在 50%~70%之间震荡。
再次调用 show prossList,网站A 的sql 调用就很少出现在结果列表中了。但发现此主机运行了几个 discuz 的论坛程序, discuz 论坛的好几个表也存在着这个问题。于是顺手一并解决,cpu占用再次降下来了。
总结以上是内存溢出为你收集整理的解决一个 MySQL 服务器进程 CPU 占用 100%的技术笔记全部内容,希望文章能够帮你解决解决一个 MySQL 服务器进程 CPU 占用 100%的技术笔记所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)