当前位置:380元网站建设 虎网站 > seo 优化 > 正文

Mysql 占用cpu资源高的分析

发布日期:2010-11-20

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

本文转自快网(www.cnkuai.cn) , 原地址:http://www.cnkuai.cn/news/20092/639.htm

3月份越南芽庄旅游攻略详细指南

    越南芽庄是越南的海滨城市,以其美丽的海滩、丰富的文化和历史遗迹而闻名于世。对于那些想要度过一个难忘假期的人来说,芽庄是一个的选择。在本篇中,我们将为您提供3月份越南芽庄旅游攻略详细指南,帮助您度过一个充满乐趣和回忆的假期。 部分了解芽庄 芽庄位于越南南部,是越南的一个省会城市。它被普遍认为是越南的旅游胜地之一,因为它拥有美丽的海滩、迷人的风景和丰富的文化。 芽庄的气候温暖,雨季从10月到12月,...

       网站建设的三个基本问题 网站建设中需要注意的其实有很多,而虎网网络就对于以下三点总结出来的   一、网站策划   网站建设始于网站策划,网站策划的好坏直接影响到网站建设的效果,因此,网站策划对于网站的运作至关重要,良好的网站策划是网站建设成功的一半。科技的网站策划基于对客户需求的调查结果和竞争分析的研究,以客户认定的网站建设目标为向导,从网站信息架构设计,网站内容建设到网站创意设计,网站功能开发等进行全面的策划,同时兼顾...

       广州南沙龙图自动化设备和虎网站签下做网站项目 龙图坐落于广州市南沙区东涌裕丰路50号(厂房1)。龙图选用虎网站经济型入门级网站案例,其功能比较简单的程序,广告单图(无动漫),页面较简单,适合小微企业产品展示型网站。龙图是经广州市南沙区工商局审核的有资质公司,统一社会信用代码:91440101093560794G。   公司产品涉及行业有:铝型材及铝幕墙、机箱机柜、家用电器、仓储货架、休闲家具、通讯器材、汽车配件、运动健材、医疗器械等。 广州...

       企业网站设计为客户提供服务 为客户提供服务 。满足顾客的需求是服务一个重要标准,积极的为客户提供便利,建立一个专门的服务后台,对相关人员进行培训,让每一个员工都可以保持为客户提供优质服务的态度。客户在体验过后进行反馈,企业根据客户的反馈进行调整,满足客户情理之中的要求,不断的完善自身的服务体系。同时,也可以在开发的时候进行市场调研,根据客户的需要进行产品研发,保证产品的发布可以吸引顾客的眼球。建立相关的平台,不需要为员工每天...

       百度移动搜索:移动网站建设常见问题集锦 据报道在11月20日,百度移动搜索沙龙在深圳召开,数十名站长与百度移动搜索团队专家热烈讨论,以下是移动搜索专家熊咏志现场回答站长高频问题的实录:   问:如果是URL、PC访问和移动访问分别识别不同的模版,例如我们有一个URL,PC访问是是这个模版,手机访问是那个模版。那么我们是使用相同的URL好,还是单独的做一个M站好?   答:理想状态下同一套url是最优的。目前受限于机制问题,还有待进一步解...

       行业门户网站推广技巧 网站推广研究资料有很多,其中不乏很多有效的推广方法虽然电子商务建设和企业网站推广的方法多,但是这些推广的方法总是万便不离其宗的。很多时候,我们不需要那么多的推广策略,需要的仅仅是,做好网站并且将选定的推广方法更深入的执行下去,这样坚持做下去网站就逐步在网上扬名了。在这里,笔者经过学习前人的经验和自己逐步的探索实验,总结出电子商务网站建设推广不可不知的五个关键步骤,供您参考,简述如下 一、 定位分析...

最新模板
少儿英语培训机构网站建设 培训公司网站建设
成人自考网站建设 成人培训网站制作设计版面
智能家居摆设设计网站建设 智能家居装修企业网站建设
铜螺母,铜螺丝,螺栓,螺钉工厂网站建设
废气处理设备,如活性炭吸附箱、RTO蓄热式氧化处理设备、光氧等离子复合设备 低温等离子设备 光氧催化设备等网企业网站建设
图文阅读