最近一臺服務器的CPU使用率長期保持在100%的狀態,查看進程發現是Mysql服務致使的。因而搜索各方資料,終於成功解決問題。備忘以及分享一下,但願能夠幫助各位新手朋友。php
(服務器運行環境是Windows server2008,Linux思路相似。只是命令行工具不一樣。)html
首先經過cmd 輸入 mysql -h localhost -u root -p 回車進入mysql數據庫mysql
經過 show processlist; 指令查看當前 mysql 使用頻繁的 sql 語句sql
反覆調用此命令發現常常出現多個相似的select語句數據庫
通過排查發現是where子句中的條件判斷中用到的字段沒有創建索引, MySQL不得不首先以第一條記錄開始並而後讀完整個表直到它找出相關的行。表越大,花費時間越多。服務器
ALTER TABLE `表名稱` ADD INDEX ( `字段名稱` ) ;
經過上方語句建立相關字段的索引後CPU立馬降低到20%左右。成功解決問題。工具
小Tips:phpmyadmin中經過表結構「操做」列表中的「索引」按鈕建立索引更方便處理,比較適合懶人操做,點一下鼠標便可解決 (* ̄︶ ̄)優化
總結:url
對 WHERE, JOIN, MAX(), MIN(), ORDER BY 等子句中的條件判斷中用到的字段,應該根據其創建索引 INDEX。索引被用來快速找出在一個列上用一特定值的行。若是表對於查詢的列有一個索引,MySQL能快速到達一個位置去搜尋到數據文件的中間,沒有必要考慮全部數據。spa
若是一個表有1000行,這比順序讀取至少快100倍。全部的MySQL索引(PRIMARY、UNIQUE和INDEX)在B樹中存儲。
根據 mysql 的開發文檔,索引 index 用於:
1,快速找出匹配一個WHERE子句的行 2,當執行聯結(JOIN)時,從其餘表檢索行。 3,對特定的索引列找出MAX()或MIN()值 4,若是排序或分組在一個可用鍵的最左面前綴上進行(例如,ORDER BY key_part_1,key_part_2),排序或分組一個表。若是全部鍵值部分跟隨DESC,鍵以倒序被讀取。 5,在一些狀況中,一個查詢能被優化來檢索值,不用諮詢數據文件。若是對某些表的全部使用的列是數字型的而且構成某些鍵的最左面前綴,爲了更快,值能夠從索引樹被檢索出來。