サーバーMYSQLのCPU使用率が高すぎるソリューションです                   友達ホスト(Windows 2003では+ IIS + PHP + MYSQL)は最近、MySQLサーバプロセス(のmysqld-NT.EXE)CPU占有率が100%高いままで常にある。このホストは10件のサイト、呼び出しに、それぞれ、約10のデータベースを持っています。友人のテストによると、mysqldの-NT.EXEにつながるCPUは、一度IISでこのサイトのサービスのうち、CPU使用率がドロップダウンします。有効になって、あなたが100パーセント上昇.MYSQLCPU決済プロセスを消費します非常に高いによって占めサイトです今朝は慎重に、約30,000ページビューをこのサイトIP-2000の7日間の現在の平均を確認しました。現在、39個のテーブルを持つデータベースとのウェブサイトを、宇宙の45メガバイトを占め、601000の数を記録します。このデータによると、 MySQLは、サーバー上でコマンドを実行して、このような高いリソースを占有することはできません、ファイルのoutput.txtにmysqlの出力電流の環境変数:D:\\ウェブ\\ mysqlの> mysqld.exe - ヘルプ> tmp_table_sizeの発見output.txtと。デフォルト値は、その後、tmp_table_sizeの200Mを割り当てるには、my.iniファイルを変更32Mです:D:\\ウェブ\\ mysqlの>メモ帳C:\\ WINDOWS \\ my.iniファイル[mysqldを] tmp_table_size = 200Mその後、MySQLサーバの占有率がわずかに減少し、再起動.CPU以前のCPU使用率の波100%の図は直線で、そして今100%〜97%の間で浮き沈み。これはtmp_table_sizeはMYSQLのパフォーマンスの役割を改善するためのパラメータを調整示しますが、問題は完全に解決されていない。そして、mysqlコマンドラインシェルを入力し、ショーを呼び出しますPROCESSLIST、現在頻繁に使用するMySQLのSQL文を表示します。showprocesslist; mysqlの>をSQL文には、多くの場合、プロセスの一覧に表示される2つのサイトを繰り返し(2回毎秒ブラシ)このコマンドを実行し、見つかった次のように、構文は次のとおりです。t1.pid SELECT t1LEFTがt1.pidLIMIT BY t1.pid = t3.pidORDER ON T2と_mydata_body JOIN t1.userid = t3.useridLEFT ON T3 AS _myuserを結合として、t2.userid、t3.count、t1.dateFROM _mydata 0,15コールチェックが列を表示しますこれら3つのテーブルの構造:mysqlの> _myuserからshowcolumns; mysqlの> _mydataからshowcolumns; mysqlの> _mydata_bodyからshowcolumnsは最終的に問題が見つかりました:_mydataテーブル、PIDに基づいて、主キーの唯一の確立を、しかし、ユーザーIDをインデックス化しませんでしたこの最初のSQL文でLEFT ON句のJOIN:LEFTはt1.userid = t3.userid_mydata上のT3 AS _myuser JOINのユーザーIDがされそして、比較演算のための条件はので、私はインデックスフィールドの確立ユーザーID :.のMysql>に応じ_mydataテーブルを与える。ALTERTABLE後 `インデックスを追加_mydata`(` userid`)は、この指標を確立し、CPUはすぐに見つける参照してください約80パーセントに低下しました。問題は、その後、別のチェックは、show PROCESSLIST SQL文再発:T1 AS _mydata FROM SELECT COUNT(*)を、_mydata_keyをチェックしてt2WHERE t1.pid = t2.pidとt2.keywordsの= '孔雀' AS _mydata_keyテーブルの構造は、主キーのみのPIDのために建て見つかり、キーワードを確立していない現在33万レコードを持っているindex._mydata_key、330の000のレコードは、インデックスが存在しない場合にテキスト検索にマッチした、CPUの多くを費やすことはありません( `keywords`)は、この指標を確立し、CPUはすぐにドロップALTERTABLE後`インデックスを追加_mydata_key`; ... mysqlの>:時間は、フィールドプラスキーワードに基づいて_mydata_keyテーブルと同じ問題ので、テーブルの検索用のインデックスがいることを奇妙に思えますダウン、再び70%〜50%の間の衝撃。コール・ショーprosslist、SQL呼び出しサイトaは、結果リストにそれほど頻繁に発生しますが、このホストが実行されていることがわかりましたいくつかの清華フォーラムのプログラムは、いくつかのテーブルがある清華フォーラムこの問題は。そう簡単に解決することが、CPU占有率がダウン再びMYSQLCPUはレッスンの値の100%を消費し解決するには、tmp_table_size .mysqlプロフィールを上げることを学びました一時テーブルがこのサイズを超えた場合、デフォルトのサイズは32Mのtmp_table_sizeで、MySQLはテーブルがクエリことによって、多くの先進的なGROUPをすれば、の値はこのオプションのtmp_table_size MySQLの公式な説明を増加させ、エラーの完全な形をtbl_nameis生成します..: tmp_table_sizeThis変数が可能querieswhereを最適化することにより、一時テーブルを避けるようにしてください。表が大きくなりすぎると、MyISAMテーブルがcreatedonディスクです。一時テーブルのメモリ内の最大サイズを決定しますが、これが不可能な場合は、ensuretemporaryテーブルにしようと常にありますあなたのニーズが引き上げ戸部tmp_table_size早期警告を与えることができます長すぎるtoresolveを取る一時テーブルとクエリのためにtheprocesslist鑑賞。メモリに保存されていること。メモリはまた、スレッドごとに割り当てられていることに注意してください。Anexaこれは多くのために働い増額mpleはandavailable、Iuppedこの32メガバイト(デフォルト)からのクエリの即時effect.The迅速解像度で64メガバイトには、以下のスレッドが生じたサーバーのすべてのラウンドの利点と、一度にbeingactiveサーバーましたメモリ。WHERE、JOIN、MAX()のために、MIN()、句及び使用決意条件の他のフィールド順に、インデックスを迅速カラムでの使用を見出すために使用されるに従って、インデックスをインデックス付けされるべきです行の特定の値。無インデックス、MySQLの最初の最初のレコードから始めて、それが該当する行を見つけるまで、テーブル全体を読まなければならない。大きなテーブル、それは取るより多くの時間を。テーブルには、インデックスにクエリの列を持っている場合、MySQLはすぐに表には、1000行、より高速な読み出しシーケンスより。すべてのMySQLのインデックス(PRIMARY、UNIQUEおよびインデックス)で少なくとも100倍を持っている場合、データのすべてを考慮する必要がなく、中間データファイルを検索する位置に到達することができますBツリー格納開発文書のMySQL:インデックスindexのための:句が参加WHERE行う際に迅速に特定のテーブル検索の他の行から、(JOIN)マッチラインを識別します。列挙されたインデックスMAX()またはMIN()値、またはソート・パケット(例えば、ORDER BYkey_part_1、key_part_2)、テーブルにソートまたはグループ化された場合、すべての重要な部分は、結合左端の使用可能プレフィックスにDESCが続く場合、キーは逆の順序で読み込まれます。いくつかのケースでは、クエリがデータファイルに相談せずに値を取得するために最適化することができる。いくつかのテーブルで使用されるすべての列が数値であり、特定のキーの左端の先頭を形成する場合、速い値はインデックスツリーから検索することができるため、あなたが次のSELECT文を発行すると仮定します。mysql> SELECT * FROM tbl_nameをWHERE COL1 = val1とCOL2 = val2の、複数列インデックスがcol1とcol2に、該当する行に存在する場合直接取り出すことができる。別の単列インデックスがcol1とcol2の上に存在する場合、オプティマイザは少ない行を見つけ、最も制限指標とラインを取るために、そのインデックスを使用してを見つけるためにどのインデックスを決定するためにしようとします。開発者行うように設計されたSQLデータ・テーブルは、考慮明らかに取るようにしてください。
Copyright © Windowsの知識 All Rights Reserved