程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL辦事器過程CPU占用100%的處理辦法

MySQL辦事器過程CPU占用100%的處理辦法

編輯:MySQL綜合教程

MySQL辦事器過程CPU占用100%的處理辦法。本站提示廣大學習愛好者:(MySQL辦事器過程CPU占用100%的處理辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL辦事器過程CPU占用100%的處理辦法正文


同伙主機(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 的服裝論壇t.vhao.net法式, Discuz 服裝論壇t.vhao.net的好幾個表也存在著這個成績。因而隨手一並處理,cpu占用再次降上去了。(2007.07.09 附注:關於 discuz 服裝論壇t.vhao.net的詳細優化進程,我後來另寫了一篇文章,詳見:萬萬級記載的 Discuz! 服裝論壇t.vhao.net招致 MySQL CPU 100% 的 優化筆記 http://www.xiaohui.com/dev/server/20070701-discuz-mysql-cpu-100-optimize.htm)
處理 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 用於:

    • 疾速找出婚配一個WHERE子句的行
    • 當履行聯絡(JOIN)時,從其他表檢索行。
    • 對特定的索引列找出MAX()或MIN()值
    • 假如排序或分組在一個可用鍵的最左眼前綴長進行(例如,ORDER BY key_part_1,key_part_2),排序或分組一個表。假如一切鍵值部門追隨DESC,鍵以倒序被讀取。
    • 在一些情形中,一個查詢能被優化來檢索值,不消征詢數據文件。假如對某些表的一切應用的列是數字型的而且組成某些鍵的最左眼前綴,為了更快,值可以從索引樹被檢索出來。

      假定你收回以下SELECT語句:
      mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
      假如一個多列索引存在於col1和col2上,恰當的行可以直接被掏出。假如離開的單行列索引存在於col1和col2上,優化器試圖經由過程決議哪一個索引將找到更少的行並來找出更具限制性的索引而且應用該索引取行。

    開辟人員做 SQL 數據表設計的時刻,必定要全盤斟酌清晰。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved