Mysql CPU占用高的問題解決方法まとめ

5304 ワード

以前のmysqlの操作経験を通して、msqlの配置問題を排除して、msqlが正常に運行しているかどうかを確認して、mysql dataディレクトリの中の*.errファイル(拡張子を.txtに変更します)のメモ帳を調べてください。もし大きすぎてノートを使うことを提案しないならば、死んでしまいやすくて、editplusなどのツールで簡単に次のいくつかのステップに分けてこの問題を解決します。rootユーザーを使ってmysql管理mysql-u root-pにパスワードmysqlを入力します。show processlist文で、負荷が一番重いSQL文を探して、このSQLを最適化します。例えば、あるフィールドのインデックスを適切に作成します。このコマンドを通じて、ある人が悪意を持って検索しているのを見ました。decms検索の後で検索の最高の単語を呼び出して、多くの人がツールでこれをこすります。しかもタイミングに間隔があるので、このphpプログラムをジャンプ方法に改名して解決しました。もちろん、もしあなたがsql文であることが確かなら、group byなどの多くの文を使って、union共同クエリなどは必ずmysqlの占有率を高めます。したがって、sql文を最適化する必要があります。サイトはできるだけ静的なものを生成します。一般的に4 Wipの固定サイトは、mysqlの占有率はほとんど0です。ですから、これはプログラマの経験について考えます。できるだけmysqlの性能を向上させる(MySQL性能最適化のベスト20以上の経験を共有する)以下は私達が集めた文章で、みんなはMYSQL CPUの占有率100%の現象を参考にして、朝友達の1台のサーバーにMysql cpuの占有率100%の問題を解決しました。ちょっと整理しましたが、この文章に経験を記録した友達のホスト(Windows 2003+IIS+PHP+MYSQL)は、最近MySQLサービスプロセス(mysqld-nt.exe)のCPU占有率が全体で100%高いです。このホストは10個ぐらいのdatabaseがあります。それぞれ10個のウェブサイトに呼び出します。友達のテストによって、mysqld-nt.exe cpuが高いのはウェブサイトAを占有して、いったんIISでこのウェブサイトを停止したら、CPUの占用は下がりました。有効にすると、すぐに上昇します。MYSQL CPUは100%の解決過程を占めています。今朝、詳しく調べてみました。現在このサイトの7日間の平均IPは2000で、PageViewは3万ぐらいです。ウェブサイトA用のdatabaseは現在39の表があり、記録数は60.1万本で、空間45 MBを占めています。このデータでは、MySQLがこんなに高いリソースを占めることはあり得ません。そこで、サーバー上でコマンドを実行して、mysql現在の環境変数をファイルoutput.txt:d:\web\mysql>mysql.exe--help>output.txtに出力して、tmpを発見しました。テーブルsizeの値はデフォルトの32 Mです。そこで、My.iniを修正して、tmp_を変更します。テーブルsizeは200 M:d:\web\mysql>notepad c:\windows\my.ini[mysqld]tmp_テーブルsize=200 MでMySQLサービスを再開します。CPU占有率はやや下がっていますが、以前のCPU占有波形図は100%の直線で、現在は97%~100%の間で起伏しています。これは調整tmp_を示していますテーブルsizeパラメータはMYSQL性能の向上に効果がある。しかし、問題はまだ完全に解決されていません。そこでmysqlのshell命令行に入り、shell processlistを呼び出し、現在mysqlが頻繁に使用されているsql文を確認します。このコマンドを繰り返しますと、サイトAの二つのSQL文は常にプロシーズリストに現れます。その文法は以下の通りです。SELECT t 1.pid、t 2.userid、t 3.count、t 1.date FROM_。mydata AS t 1 LEFT JOIN_myser AS t 3 ON t 1.userid=t 3.userid LEFT JOIN_mydata_body AS t 2 ON t 1.pid=t 3 pid ORDER BY t 1.pid LIMIT 0,15 show columnsを呼び出してこれらの3つのテーブルの構造を確認します。mysql>show columns from_myser;mysql>show columns from_mydata;mysql>show columns from_mydata_body;やっと問題点を発見しました。mydata表は、pidだけに基づいてprimry keyを作成しましたが、useridのインデックスを作成していません。このSQL文の最初のLEFT JOIN ON子文の中で、LEFT JOIN_myser AS t 3 ON t 1.userid=t 3.userid_mydataのuseridは条件比較演算に参加されました。そこで私は_にあげますmydata表はフィールドuseridによってインデックスを作成しました。mysql;ALTER TABLE`umydata`ADD_INDEXがこのインデックスを作成した後、CPUはすぐに80%ぐらいに下がった。問題点が見つかったので、もう一つのショープロリストに繰り返し出てくるsql文をチェックします。SELECT COUNT(*)FROM_mydata AS t 1,_mydata_key AS 2 WHERE t 1.pid=t 2.pid and t 2.keywods='孔雀'は検査を受けました。mydata_key表の構造は、pidのためだけにprimrykeyが作られていることを発見しました。keywordsのためにindexが作られていません。mydata_keyは現在33万件の記録を持っていますが、インデックスがない場合は33万件の記録をテキスト検索でマッチングします。この表に対する検索に問題があるようです。そして同じようにmydata_key表はフィールドkeywordsに従ってインデックスを付けます。mysql;ALTER TABLE`umydata_key`ADD_INDEXがこのインデックスを作成した後、CPUは直ちに50%~70%の間に震動しました。再度show prosslistを呼び出して、ウェブサイトAのsql呼び出しはめったに結果のリストの中で現れませんでした。しかし、このホストはいくつかのDiscuzのフォーラムプログラムを実行しています。Disczフォーラムのいくつかのテーブルにもこの問題があります。そこで、ついでに解決しました。cpu占用は再び下がりました。2007.07.09付注:discuzフォーラムの具体的な最適化過程について、後にもう一つの文章を書きました。詳しくは:千万級記録のDiscz!フォーラムの結果、MySQL CPU 100%の最適化メモhttp://www.xiaohui.com/dev/server/20070701-discuz-mysql-cpu-100-optimize.htm)MYSQL CPU占有率100%の経験総括を解決し、tmp_を増やす。テーブルsize値mysqlの配置ファイルの中で、tmp_テーブルsizeのデフォルトサイズは32 Mです。もしこのサイズを超える臨時テーブルがあったら、MySQLはThe table tblを生成します。name is full形式のエラーは、多くの高級GROUTP BY検索をすれば、tmp_を増加します。テーブルsize値これはmysql公式のこのオプションについての説明です。テーブルsize This variable determines the maximsize for a temporary table in memory.If the table becompres too large,a MYISAM table is created on disk.Try to avoid temporary table by optimizing the hers hers ble porisetry to ensure temporary tables are always stored in memory.Watching the processlist for queries with temporary tables that tare too long reve can give you an early warning thtmp。テーブルsizzzeeedis to be uuuped.Be aware that memomoryalso allocated per- thread.An eeeeeeeeeeexample whee uupiping thiswoked for more more was a server ver I uuped thisfffrom 32 MB(the default)to 64 MB wiwiwiwiwiwiwiwiwiwiwiwiwiwiwiwiwiwiwiwiwiwiwiwith th th th th m m m m m m m m m m m m m m m m m m m medidididididididididididididididididididididididididididididieeeeeeeeeeeefits for the server,and available memory.WHERE、JOIN、MAX()、MIN()、ORDER BYなどの子文における条件判断に用いるフィールドは、それに基づいてインデックスINDEXを作成するべきである。インデックスを使用して、特定の値を使用した列を素早く見つけることができます。インデックスがありません。MySQLはまず最初のレコードで開始し、それからテーブル全体を読み終えて、関連する行を見つけるまで読まなければなりません。時計が大きいほど、時間がかかります。テーブルがクエリーの列にインデックスがある場合、MySQLはデータファイルの中間を検索するための場所に素早く到達します。すべてのデータを考慮する必要はありません。一つの表が1000行あると、順番読みより少なくとも100倍速いです。すべてのMySQLインデックス(PRIMARY、UNIQUE、INDEX)はBツリーに格納されています。mysqlの開発文書によると、索引indexは、一つのWHERE子文に合致する行を素早く見つけて連結を実行する場合、他の表から行を検索するために使用されます。特定のインデックス列に対してMAX()またはMIN()の値を求める場合、順序付けまたはパケットが利用可能なキーの一番左のプレフィックス上で行われる(例えば、ORDER BY key_)。パーティー1,key_パーティー2)並べ替えまたはグループ化します。すべてのキー部分がDESCに続く場合、キーは倒順で読み込まれます。いくつかの場合、一つのクエリは、データファイルに関する問い合わせなしに、値を検索するために最適化されることができる。いくつかのテーブルのすべてに使用される列がデジタルであり、いくつかのキーを構成する一番左のプレフィックスであれば、より速くするために、値はインデックスツリーから検索され得る。以下のSELECT文を発行すると仮定します。mysql>SELECT*FROM tblname WHERE col 1=val 1 AND col 2=val 2;col 1およびcol 2に複数の列のインデックスが存在する場合、適切な行を直接取り出しても良い。分離された単一の列インデックスがcol 1およびcol 2に存在する場合、最適化器は、どのインデックスがより少ない行を見つけるかを決定することによって、より制限されたインデックスを見つけ、インデックスを使用して行を取ることを試みる。開発者がSQLデータ表の設計をする時は、必ず全面的に検討してください。