转载的

MYSQL CPU 占用 100% 的现象描述

早上帮别人一台服务器解决了 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占用再次降下来了。

解决 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 mysql cpu100_mysql进程占服务器cpu100%的解决方法相关推荐

  1. 关于Linux服务器磁盘空间占满问题的解决方法

    下面给大家分享一篇关于Linux服务器磁盘占满问题解决方法(/dev/sda3 满了),需要的的朋友参考下吧 下面我们一起来看一篇关于Linux服务器磁盘占满问题解决(/dev/sda3 满了),希望 ...

  2. spoolsv.exe占CPU100% 的解决方法

    spoolsv.exe占CPU100% 的解决方法 spoolsv.exe是打印缓冲,没有打印机就关掉,有的话在打印时会占用很大内存.因为要打印的文件要转化格式. 禁止Print spooler服务, ...

  3. Navicat无法远程连接MySql服务器问题的解决方法

    Navicat无法远程连接MySql服务器问题的解决方法 写在前面: 操作系统:银河麒麟4.0: 数据库:MySQL5.7.26: JDK:采用银河麒麟系统自带的openjdk: 客户端工具:Navi ...

  4. win10服务器cpu占用过高,Win10 CPU占用率100%怎么办 Win10 CPU占用率过高解决方法

    Win10 CPU占用率100%怎么办 ?Win10系统CPU占用率过高的问题比较常见,下面为大家带来 Win10 CPU占用率过高解决方法 ,一起来看看. 方法1: 导致CPU占用的另一个原因可能是 ...

  5. mysql主从复制及主机宕机的解决方法

    mysql主从复制及主机宕机的解决方法 文章目录 mysql主从复制及主机宕机的解决方法 概念 为什么需要主从复制 主从复制原理 主从搭建 删除mysql 开始搭建 Mysql主机宕机的解决方法 本篇 ...

  6. Windows7 IIS 500-内部服务器错误的解决方法

    内部服务器错误的解决方法: 1.打开IIS,在功能视图中找到"错误页",双击进去后,看最右边的"操作"下的"编辑功能设置-",将" ...

  7. Centos 7 mysql Buffered warning: Changed limits: max_connections: 214 解决方法

    2019独角兽企业重金招聘Python工程师标准>>> Centos 7 mysql Buffered warning: Changed limits: max_connection ...

  8. “http 500内部服务器错误”的解决方法

    "http 500内部服务器错误"的解决方法 IIS500错误,是因为微软的一个BUG所造成的.下面是解决办法: 主要是由于IWAM账号(在我的计算机即是IWAM_MYSERVER ...

  9. isfull mysql_MySQL数据库之MySQL 出现 The table is full 的解决方法

    本文主要向大家介绍了MySQL数据库之MySQL 出现 The table is full 的解决方法 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 当我们要写入新数据而发生& ...

最新文章

  1. 杰和弯道超车 推企业级NAS存储应用方案
  2. 基于Html5的移动端开发框架的研究
  3. EJB3 学习笔记六
  4. css英文左右对齐,中文英文左右padding一致两端对齐实现_js
  5. linux-3-which-whoaii-chmod数字法与符号法
  6. python建立虚拟环境付款_python 创建虚拟环境(virtualenv)
  7. uuid表示时间的部分_基于时间UUID的妙用
  8. 特征提取、特征描述、特征匹配的通俗解释
  9. Winform获取本地IP和外网IP
  10. Eclipse 模板使用
  11. 强劲有力的EnableQ在线调查问卷引擎
  12. 研究生教育学科专业目录(2022年)与研究生教育学科专业目录管理办法
  13. AD9833介绍与应用(C语言实现)
  14. xp系统禁用wmi服务器,windows xp系统启用WMI服务的方法
  15. [embeded] Relocations in generic ELF (EM: 183)
  16. 【补丁】YYC松鼠短视频系统补丁,增加视频点赞数据管理功能,可修改点赞数量,V2.8的功能
  17. 机器学习:考试预测实战(特征隐射,独热编码,特征重要性选择,网格搜索调参)
  18. java一道多线程题,子线程循环10次,主线程接着循环100次,如此循环50次的问题
  19. 如何判断车距:车距判断技巧图解
  20. iOS 一个带动画的等待指示器

热门文章

  1. java 类 比较大小_java 类比较大小(实现Comparable接口)
  2. spring boot 学习之五(日志配置)
  3. 通过分区(Partitioning)提高Spark的运行性能
  4. 【Linux文件系统监控的Java类库 inotify-java】
  5. OpenCV-数组加权和cv::addWeighted
  6. 判断三个数是否能构成三角形_【内含干货】611. 有效三角形的个数
  7. windowslinux服务器性能对比,Windows/Linux服务器的选择与对比
  8. android 吐司服务中显示,android里的“吐司”
  9. mysql 密码重置 linux_怎么在linux系统重置mysql的root密码
  10. 长沙android工程师,长沙安卓工程师辅导