Mysql的cpu占用居高不下的解决办法

1、先看个命令:

SHOW [FULL] PROCESSLIST

SHOW PROCESSLISTshows you which threads are running. You can also get this information using themysqladmin processlistcommand. If you have thePROCESSprivilege, you can see all threads. Otherwise, you can see only your own threads (that is, threads associated with the MySQL account that you are using). If you do not use theFULLkeyword, only the first 100 characters of each statement are shown in theInfofield.

命令的意思是列出当前用户的或者是整个mysql服务器的所有线程。那么在mysql遇到性能问题的时候,大可以用这个命令列出来所有的线程,看看哪个线程哪个查询耗用的时间最多,然后给相应的查询建立索引。如上图,在进行一个较耗时的插入操作的时候,比如说insert into stu select * from stu,那么上图是state列会显示出来当前线程正在进行的操作,比如sending data。info字段会一些其他信息,比如说,copying data to tmp file on disk【把表数据拷贝到临时文件】等信息。如下图

2、explain你的查询

系统设计好之后,也可以在使用的时候,使用explain,查看一下设计的sql的执行过程和预期的是否一致?是否用到了自己设计的索引?

3、在进行join查询的时候,对被join的表的字段设计索引。【我们知道,在两个表之间建立外键的时候,是需要在列上建立索引的。主要是为了加快查询速度。那么在join的列上,我们当然也参考这个思路,建立索引以加快查询。】

4、当要对某一个特定的列做max或者min函数的时候,最好也建立一个索引。

5、如果需要用到像是性别、年龄、city等这样的可以用enum的字段,就不要用varchar。这也是mysql user manual上的建议。【An enumeration can have a maximum of 65,535 elements.】。但是当要跟其他数据库之间做数据迁移的时候,就非常不方便了。因为enum几乎不被其他数据库所支持。特别是在mysql中用字符串作为enum的时候,想换成int之类的数据都不行。另外,varchar占用内存的问题也是比较严重的【varchar声明多长,就占用多少内存。但是在磁盘上存储的时候,则是存储的长度字段的一到两个字节加上数据长度。】

6、拆分大的delete或者是insert类型的操作

如果要操作的数据量太大,那么这些操作会让当前应用整体停掉。这样的体验是很不好的 。

可以如下这样来做:

while (1) { 
//每次只做1000条 
mysql_query("DELETE FROM logs WHERE log_date <= '2009-11-01' LIMIT 1000"); 
if (mysql_affected_rows() == 0) { 
// 没得可删了,退出! 
break; 
} 
// 每次都要休息一会儿 
usleep(50000); 
}

 

每次操作一定数量的数据,然后停止一段时间供其他用户或者是进程线程之类的来使用数据库。

你可能感兴趣的:(mysql,笔试面试)