解决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 占用再次降下来了。

  至此,问题解决。

  解决 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 用于:

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

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

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

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

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

  假定你发出下列 SELECT 语句:
MySQL> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;

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

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

转载于:https://www.cnblogs.com/zeroone/archive/2012/06/08/2541305.html

解决MySQL CPU占用100%的经验总结 转相关推荐

  1. 论坛mysql cpu100_解决 MYSQL CPU 占用 100% 的经验总结

    朋友主机(Windows 2003 + IIS + PHP + MYSQL )近来 MySQL 服务进程 (mysqld-nt.exe) CPU 占用率总为 100% 高居不下.此主机有10个左右的 ...

  2. 解决MySQL CPU占用100%的经验总结

    朋友主机 (Windows 2003 + IIS + PHP + MySQL) 近来 MySQL 服务进程 (MySQLd-nt.exe) CPU 占用率总为 100% 高居不下.此主机有10个左右的 ...

  3. discuz mysql cpu 100_Discuz导致MYSQL CPU 占用 100%?

    转自 http://hi.baidu.com/xooass/blog/ ... e9ec2d11df9b8d.html 今天早上仔细检查了一下.目前此网站的七日平均日 IP 为2000,PageVie ...

  4. mysql开启日志占cpu不_使用MySQL Slow Log来解决MySQL CPU占用高的问题

    但是怎么找到是哪个SQL语句的执行时间过长呢?可以通过MySQL Slow Log来找,详解如下. 首先找到MySQL的配置文件my.cnf,根据不同版本的mysql开启慢查询的配置也不一样 mysq ...

  5. php mysql cpu100_MySQL服务器进程CPU占用100%的解决方法

    早上帮朋友一台服务器解决了 Mysql cpu 占用 100% 的问题.稍整理了一下,将经验记录在这篇文章里. 朋友主机(Windows 2003 + IIS + PHP + MYSQL )近来 My ...

  6. 织梦mysql占用资源_解决一个 MySQL 服务器进程 CPU 占用 100%的技术笔记

    早上帮朋友一台服务器解决了Mysql cpu 占用 100%的问题.稍整理了一下: 朋友主机(Windows 2003 + IIS + PHP + MYSQL )近来 MySQL 服务进程 (mysq ...

  7. mysql-nt.exe w3wp.exe cpu 100%_w3wp.exe(IIS ) CPU 占用 100% 的常见原因及解决办法

    对于IIS管理员来说,经常会碰到Web服务器CPU占用100%的情况,以下是个人的日常工作总结和一些解决办法,主要用来剖析w3wp.exe(IIS )占用CPU 100%的一些原因 和解决方案,希望能 ...

  8. CPU占用100%的原因及解决办法

    经常出现cPU占用100%的情况,主要问题可能发生在下面的某些方面: cPU占用率高的九种可能 1.防杀毒软件造成故障 由于新版的KV.金山.瑞星都加入了对网页.插件.邮件的随机监控,无疑增大了系统负 ...

  9. CPU占用100%原因及解决方法

    CPU占用100%原因及解决方法 我们在使用Windows XP操作系统的时候,用着用着系统就变慢了,一看"任务管理器"才发现CPU占用达到100%.这是怎么回事情呢?遇到病毒了, ...

最新文章

  1. 除了Tapd,还有哪些好用的项目管理工具,适用于100+人的大中型团队?
  2. flex4实现图片的动态切换
  3. 模组使用之天线阻抗匹配、匹配过程、天线选型注意、RF走线Layout建议
  4. 【转】排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序...
  5. SQL Server 中如何判断表是否存在
  6. 新建linux 服务器初始化配置
  7. packETH发包工具使用教程
  8. python读取excle表格数据,将数据编辑到图像上工程
  9. 哨兵一号数据snap预处理_利用SNAP软件进行Sentinel-1A卫星微波影像的预处理
  10. 数据全裸时代,你的隐私有多容易获取?
  11. SpringCloud:学习 Docker安装Consul,注册服务
  12. 一文看懂数据预处理最重要的3种思想和方法
  13. 大开眼界:Facebook做了一个会“开眼”的AI,拯救眨眼照片
  14. java虚拟机手动内存分配_《深入理解java虚拟机》-垃圾收集器与内存分配策略
  15. git 查看和修改用户名及邮箱
  16. MOOC-首都师范-博弈论-焦宝聪-第六章-动态博弈学习笔记(五)
  17. 海量数据的常见处理算法
  18. 字节跳动基于ClickHouse优化实践之“高可用”
  19. 一个屌丝程序猿的人生(九十二)
  20. 凶猛的长城汽车:走在挑战万亿市值的征途上

热门文章

  1. python自动下载酷狗音乐_Python下载酷狗音乐
  2. leetcode 最长单词
  3. 校招提前批之今日头条一面
  4. Wrong namespace. Expected 'cn.itheima.dao.CustomerMapping' 错误
  5. 《侍神令》中真正的“阴阳师”日常吃什么料理?新鲜鱼类最珍贵~
  6. php导出excel失败原因,PHPExcel中导出Excel出错的一种可能原因
  7. Win10照片应用的小bug——自动模糊图片(有过渡色)
  8. Python最抢手、Java最流行、Go最有前途,7000位程序员揭秘2019软件开发现状
  9. 支持C/C++、Java、python、Matlab等语言的第三方机器学习库汇总
  10. linux 打开三维stl文件,三维stl文件查看工具下载