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

今天早上起来机器报警一查负载一直都在4以上
top了一下发现mysql稳居第一而且相当稳定我擦
重启一下mysql不行
mysql>showprocesslist;一下
发现xxx网站有两条查询语句一直在列,我擦该站也就30多万条记录量也不大不可能是机器性能问题

忽然记得以前在网上看过说是 tmp_table_size值太小会造成这种情况;
于是mysql-pxxx-e"showvariables;">tmp
一看是默认的32M(显示出来的是字节数)
于是翁就开心的改了起来增加到256重启mysql。。结果很失望

不行啊还得再来
select一下该表发现里面都是论坛留言的东西量还挺大
于是:
mysql>showcolumnsfrombbs_message;
+-----------+--------------+------+-----+---------+----------------+
|Field|Type|Null|Key|Default|Extra|
+-----------+--------------+------+-----+---------+----------------+
|msg_id|int(11)|NO|PRI|NULL|auto_increment|
|board_id|int(11)|NO|MUL|0||
|parent_id|int(11)|NO|MUL|0||
|root_id|int(11)|NO|MUL|0||

一直在showprocesslist里面出现的就是select*frombbs_messagewhereboard_id=xxxandparent_id=xxx
和select*frombbs_messagewhereparent_id=xxx
只要这两条一出现cpu就上去了
于是从索引入手:
增加两条索引
mysql>altertablebbs_messageaddindexparentid(parent_id);
altertablebbs_messageaddindexchaxunid(board_id,parent_id);
最后查看一下索引结果:
mysql>showindexfrombbs_message;
+-------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
|Table|Non_unique|Key_name|Seq_in_index|Column_name|Collation|Cardinality|Sub_part|Packed|Null|Index_type|Comment|
+-------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
|bbs_message|0|PRIMARY|1|msg_id|A|2037|NULL|NULL||BTREE||
|bbs_message|1|rootid|1|root_id|A|49|NULL|NULL||BTREE||
|bbs_message|1|chaxunid|1|board_id|A|3|NULL|NULL||BTREE||
|bbs_message|1|chaxunid|2|parent_id|A|135|NULL|NULL||BTREE||
|bbs_message|1|parentid|1|parent_id|A|127|NULL|NULL||BTREE||
+-------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
5rowsinset(0.00sec)
退出在top一下负载一直在0.x很稳定
b.gif