`

Mysql 占用cpu资源高

阅读更多

朋友主机(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 数据表设计的时候,一定要通盘考虑清楚

分享到:
评论

相关推荐

    查询那些语句占用CPU

    查询那些语句占用CPU

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

    最近发现php网站发布信息比较慢,而且同网站目录下的asp经常登录后立即就重新登录,立即考虑到服务器资源占用问题,所以进服务器看到原来mysql占用率较高 25-60%左右,偶尔能跑到100%,所有导致上述问题的发生

    使用LoadRunner监控MySQL在Apache下占用CPU资源情况的方法

    在做性能测试时我们经常需要监控服务器上各种进程占用内存、CPU、IO等的资源使用情况,本文档告诉你如何通过LoadRunner监控MySQL在Apache下的CPU占用情况,帮助你监控分析服务器端的性能情况。

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

    朋友主机(Windows 2003 + IIS + PHP + MYSQL )近来 ... MYSQL CPU 占用 100% 的解决过程 今天早上仔细检查了一下。目前此网站的七日平均日 IP 为2000,PageView 为 3万左右。网站A 用的 database 目前有39个表,记录数

    mysql占用CPU过高的解决办法(添加索引)

    下面是MYSQL占用CPU高处理的一个例子,希望对遇到类似问题的朋友们有点启发。一般来说MYQL占用CPU高,多半是数据库查询代码问题,查询数据库过多。所以一方面要精简代码,另一方面最好对频繁使用的代码设置索引。 ...

    Mysql占用过高CPU时的优化手段(必看)

    Mysql占用CPU过高的时候,该从哪些方面下手进行优化? 占用CPU过高,可以做如下考虑: 1)一般来讲,排除高并发的因素,还是要找到导致你CPU过高的哪几条在执行的SQL,show processlist语句,查找负荷最重的SQL语句...

    discuz 论坛运行缓慢 mysql cpu占用率 100% 一例分析

    mysql cpu占用率 100%的解决方法,其实mysql cpu占用高了,一般都是一些语句比较占资源。

    2017最新老男孩MySQL高级专业DBA实战课程全套【清晰不加密】,看完教程月入40万没毛病

    第一部 MySQL基础入门(21节) 01-老男孩运维DBA课程开班...04-linux进程占用cpu高的解决方案案例.avi 05-数据库账户权限控制多种思路及技巧.avi 06-数据库客户端安全控制策略详解.avi 07-数据库运维的核心管理思想.avi

    自己总结的Win+IIS+PHP+MySQL疑难杂症解决办法

    Windows2003+IIS6.0+php(ISAPI)环境中w3wp.exe占用CPU资源的解决办法; MySQL无法正常启动,服务器管理器里面按钮灰色等MySQL问题解决办法; windows2003服务器上级目录权限导致的问题; MYSQL提示Table '表名' doesn't ...

    maven工程在Linux上部署

    将maven工程部署到Linux系统(包括jdk,MySQL,Oracle,Redis,mq等软件在Linux上的安装)

    php 随机记录mysql rand()造成CPU 100%的解决办法

    百度查阅了一些资料,再结合自己的一些经验,采用以下解决办法: ... 原理其实很简单,就是产生一组随机ID,然后检索这一组ID对应的记录,经过这样优化,页面打开速度明显快了很多,CPU占用率也小到几乎为0,呵呵~顺便

    使用cgroups来限制MySQL企业备份服务对资源的占用

    主要介绍了使用cgroups来限制MySQL企业备份服务对资源的占用,以限制mysqlbackup相关的进程和线程对CPU和内存的闲时消耗,需要的朋友可以参考下

    mysql数据库my.cnf配置文件

    # MySQL的最大连接数,如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,介于MySQL会为每个连接提供连接缓冲区,就会开销越多的内存,...

    比 MySQL 和 MongoDB 快10倍的 OLTP 关系数据库和文档数据库.zip

    创建 JDBC 连接非常快速,占用资源少,不再需要 JDBC 连接池 插件化存储引擎架构,内置 AOSE 引擎,采用新颖的异步化 B-Tree 插件化事务引擎架构,事务处理逻辑与存储分离,内置 AOTE 引擎 支持 Page 级别的行列...

    MySQL数据库服务器逐渐变慢分析与解决方法分享

    除此之外,还应观注那些占用系统资源(cpu、内存)的进程。 1.使用sar来检查操作系统是否存在IO问题 #sar-u210— 即每隔2秒检察一次,共执行20次。 结果示例: 注:在redhat下,%system就是所谓的%wio。 Linux2.4.21-...

    人工智能-项目实践-向量搜索-基于faiss的向量搜索与管理.zip

    向量搜索支持使用 GPU 加速,量大时加速明显,不占用cpu资源 使用 mysql 进行元数据存储,每个向量可添加单独备注信息 faiss 中数据使用 float16 半精度计算,节约存储和计算资源 良好的数据落盘机制,减少应用崩溃...

    MySQL实现MYISAM表批量压缩的方法

    本文实例讲述了MySQL实现MYISAM表批量压缩的方法。分享给大家供大家参考,具体如下: 关于对MYISAM表的压缩,可以使用myisampack和...而且压缩过程会很占用cpu资源,建议在服务器空闲的状态进行。 下面是用于实

    常用shell 脚本,dos攻击防范,

    找出占用CPU 内存过高的进程脚本.sh 更多精品教程.url 服务器系统配置初始化脚本.sh 本教程由我爱学it提供.url 查看网卡实时流量脚本.sh 监控100台服务器磁盘利用率脚本.sh 监控MySQL主从同步状态是否异常脚本...

    人力资源管理系统数据库设计.doc

    3.2 软件支持环境及开发工具 软件支持环境:WINDOS XP 操作系统 硬件环境:CPU:intel P4, 内存:512M 开发工具:mysql 4.系统总体结构 4.1 总体DFD 如下图所示人力资源管理数据流程图 4.2 功能结构 4.3 数据库结构...

    PDENV v1.4.0

    主要特点:用Nginx取代Apache, 性能优于Apache,占用更少的内存和CPU资源 Nginx是Native编译,非Cygwin版本,性能更好 用CGI的方式运行PHP, 性能优于ISAPI的方式 不仅适用于开发环境,也可用于生产环境部署 包含...

Global site tag (gtag.js) - Google Analytics