1. 程式人生 > >Mysql的cpu佔用居高不下的解決辦法

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 theFULL

keyword, 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); 
}

每次操作一定數量的資料,然後停止一段時間供其他使用者或者是程序執行緒之類的來使用資料庫。