パフォーマンスの最適化MySQLをチェックします

このコマンドは、クライアントのIPアドレスから、SQL、データベース名の実行、実行状態を通知する、SQLステートメントが現在実行されて見ることができ、アカウント、実行時間などを使用
深刻な問題に直面してMySQLの性能を、一般的には、そのいくつかの可能性:
1は、インデックスが完了していない;
2、SQL文言は、あまりにも複雑である;
3、構成エラー;
4、マシンができない、本当に負荷;
1、インデックスが完了しない
場合あなたがチェックするのmysqlクライアントツールを使用することができ、CPUを消費し、多くのmysqlのを参照してください。
Linuxで実行
は/ usr / local / MySQLの/ binに/ MySQLの-hlocalhost-uroot - Pの
パスワードがない場合は、パスワード、あなたはクライアント・インターフェースに-pパラメータなしで入力することができます。
現在の動作状態を見てみましょう
フルPROCESSLISTが示す
よりも数倍以上実行することができ
、このコマンドをSQL文は、現在のアカウントを使用し、それはクライアントのIPから、SQL、データベース名の実行、実行状態を通知する、実行されて見ることができます時間やその他の情報を実行している
私のキャッシュバックエンドでは、ほとんどの時間、任意のSQL文の画像がない、私はそれだけで比較的正常だと思います。あなたは、SQL文の多くが表示された場合、これは確かにMySQLのパフォーマンスの問題があります
パフォーマンスの問題がある場合、それを分析することができます:
1、立ち往生SQL文ではないでしょうか?
これは、より多くのケースで、データベースの場合MyISAMテーブルの使用は、この文が完了しない場合、他の文が実行されていない、ロックされたテーブルにデータを書き込みますスレッドがあるかもしれない、です。
この1時間の表示PROCESSLISTは、長い文の実行時間がある場合は、これらの記述に注意を払う参照してください。
2、同じSQL文の多くは実行されている
。このような場合には、それは、SQL文の実行効率が低いことが可能であり、同じことは、これらのステートメントに注意を払う必要があります。
次に、これらのステートメントを調べるために(説明)DESCを使用して、コレクションに関するすべての文を疑いました。
通常の出力DESCを初めて目:
MySQLの> DESC SELECT * WHERE imgid IMGS = 1651768337から;
+ ---- + ------- + ------------- + - --------------- + ------ + --------- + --------- + ------- + ------- + ------ +
|上記ID | SELECT_TYPE |表|タイプの| possible_keys |キー| key_lenに| REF |行|エキストラ|
+ ---- + ------- ------ + ------- + ------- + ----- + --------- + - + ------- + ------ + -------- + -------
| 1 | SIMPLE | IMGS |のconst | PRIMARY | PRIMARY | 8 |のconst | 1 | |
+ ------------- + ---- + ------- + ------- + ------------ + --------- + --------- + --- + ------ + ------- + -------
1行でセット(0.00秒)
注キー、行3エクストラは、この文は結果がSQLクエリPRIMARYプライマリ・キー・インデックスの使用を示して返し、結果はそれはソートや他の操作は使用を証明していない、エクストラ示さなかった、セット番号です。この結果は、このレコードは、インデックスからimgid mysqlのクエリ= 1651768337、推測することができ、その後、すべての実際のテーブルのフィールドを削除するには、それは非常に簡単な操作です。
キーは、インデックスがSQLの現在の使用のみが、この制限に注意を払う、インデックスに簡単な文を実行MySQLを使用することを示している。行が返される結果セットのサイズである、結果セットは、すべての検索結果を一致させるために、インデックスを使用することです。エクストラ通常、道のクエリおよびソートを表示します。
あなたがキー、または行を使用しない場合は大きく、filesortレコードの並べ替えを使用して、通常の効率に影響を与える、など:
MySQLの> SELECT * DESC IMGSからWHEREユーザーID =「7mini」注文クリックDESCの制限により、10;
+ ---- + ------------- + --------------- + ------- + ------ + ----- - + --------- + ------ + ------- + ----------------------- + ------
|上記ID | SELECT_TYPE |表|タイプの| possible_keys |キー| key_lenに| REF |行|エキストラ|
+ ---- + ------------- + - ----- --------------- + ------ + ------ + ---- + --------- + - + ------- + ----------------------------- +
| 1 | SIMPLE | IMGS | ALL | NULL | NULL | NULL | NULL | 12506 | WHEREを使用して、使用するfilesortレコード|
+ ------------- + ----- + ---- - + --------------- + ------ + ------ + ------ + --------- + + ----------------------------- + -------
SET(0.00秒)に1行
このSQL結果12506回の集会は、それは非常に実行効率を消費することになるので、filesortレコードを使用し、そこにあります。この時点でのMySQLの実装では、一つ一つが、ユーザーID =「7mini」レコードをマッチング見つけるために、もう一度、テーブル全体をスキャンし、その後、これらのレコードをクリック並べ替えを実施すべきである、効率を想像することができます。実際の実行があれば、比較的速い見つけたとき、サーバーのメモリはまた、すべてのメモリに読み込ま12506比較的短い記録するのに十分であるので、それがあるので、それは比較的高速ですが、同時乗算やテーブルまで大きな、そして深刻な問題の効率。
それから私は、インデックスに追加されたユーザーIDを置きます:
IMGS(ユーザーID)のインデックスユーザーIDを作成します。

 

その後、確認してください。
MySQLの> DESCクリック数の降順限界10によってユーザーID = "7mini" 注文IMGS SELECT * FROM。
+ ---- + ------------- + ------- + ------ + --------------- + -------- + --------- + ------- + ------ + --------------- -------------- +
| ID | SELECT_TYPE | 表| タイプ| possible_keys | キー| key_lenに| REF | 行| エクストラ|
+ ---- + ------------- + ------- + ------ + --------------- + -------- + --------- + ------- + ------ + --------------- -------------- +
| 1 | SIMPLE | IMGS | REF | ユーザーID | ユーザーID | 51 | const | 8 | どこ使い方; filesortレコードを使用して|
+ ---- + ------------- + ------- + ------ + --------------- + -------- + --------- + ------- + ------ + --------------- -------------- +
セット内の1行(0.00秒)

 


ああ、あなたは、このユーザーIDのmysqlはインデックス検索を使用して見ることができ、およびユーザーIDのインデックスと検索した後、結果セットが8を持っています。その後、filesortレコードを使用するソートが、しかし、結果セットは、単なる8であるので、効率を軽減することができます。
私は、他のユーザーIDに確認場合は、結果が異なることになります。
MySQLの> DESCクリックのDESCの上限10でユーザーID =「管理者」ためIMGSから選択*;
+ ---- + ------------- + ------- + ------ + --------------- + -------- + --------- + ------- + ------ + --------------- -------------- +
| ID | SELECT_TYPE | 表| タイプ| possible_keys | キー| key_lenに| REF | 行| エクストラ|
+ ---- + ------------- + ------- + ------ + --------------- + -------- + --------- + ------- + ------ + --------------- -------------- +
| 1 | SIMPLE | IMGS | REF | ユーザーID | ユーザーID | 51 | const | 2944 | どこ使い方; filesortレコードを使用して|
+ ---- + ------------- + ------- + ------ + --------------- + -------- + --------- + ------- + ------ + --------------- -------------- +
セット内の1行(0.00秒)

 


この結果、ユーザーID =「7mini」の結果は基本的に同じですが、filesortレコードのための2944レコードメモリに参加する2944に到達するために、結果セットのサイズと検索インデックスMySQLのユーザーID、後に、効率はその7miniよりたくさん悪いですA。その後、最初のアプローチは、インデックスと結合されているを解決し、私はデータトラフィックに応じて最大10を取る必要があるため、条件を決定するには2つの方法がありますので、私は組合せの順序に追加する必要はありません多くのデータは、次のような、あります10未満にクリックし、そのようなデータは、大部分を占めていることがあります。
私はどこクエリその後さらに条件を追加、クリック数のインデックスを追加しました:
IMGS(クリック)上のインデックス・クリックを作成します。
MySQLの> DESCクリックのDESCの上限10でユーザーID =「管理者」ためIMGSから選択*;
+ ---- + ------------- + ------- + ------ + --------------- + -------- + --------- + ------- + ------ + --------------- -------------- +
| ID | SELECT_TYPE | 表| タイプ| possible_keys | キー| key_lenに| REF | 行| エクストラ|
+ ---- + ------------- + ------- + ------ + --------------- + -------- + --------- + ------- + ------ + --------------- -------------- +
| 1 | SIMPLE | IMGS | REF | ユーザーID、クリック| ユーザーID | 51 | const | 2944 | どこ使い方; filesortレコードを使用して|
+ ---- + ------------- + ------- + ------ + --------------- + -------- + --------- + ------- + ------ + --------------- -------------- +
セット内の1行(0.00秒)

 


そして、あなたはpossible_keysは、すべてのインデックスは、mysqlはアクセスして文を実行するための一つの指標から、独自のpossible_keysに決定されます一致させることができ、ユーザーID、クリック数、possible_keysになる見ることができ、それは、MySQLへのアクセスは、このインデックスは必ずしもない、ということは注目に値しますこれは、最適化されています。クエリMySQLのユーザーIDまたは照会するために、このインデックスを使用して、ではない私の意志によると、その結果は変更されませんでした。クリックのインデックスを使用して変更を強制MySQLのSQLに加えて使用インデックス:
MySQLの> DESCクリックするDESC制限10によってインデックス(クリック)ユーザーID =「管理者」とクリック> 10順序を使用IMGSから選択*
+ ---- + ------------- + ------- + ------- + -------------- -  + -------- + --------- + ------ + ------ + ------------- +
| ID | SELECT_TYPE | 表| タイプ| possible_keys | キー| key_lenに| REF | 行| エクストラ|
+ ---- + ------------- + ------- + ------- + -------------- -  + -------- + --------- + ------ + ------ + ------------- +
| 1 | SIMPLE | IMGS | レンジ| クリック| クリック| 4 | NULL | 5455 | |どこ使い方
+ ---- + ------------- + ------- + ------- + -------------- -  + -------- + --------- + ------ + ------ + ------------- +
セット内の1行(0.00秒)

 


その後、クエリがインデックスをクリックしたMySQLを使用しますが、その結果は、まだ限定されるようにしているようだよりユーザーID大きなセット!:
MySQLの> DESCクリックするDESC制限10によってインデックス(クリック)ユーザーID =「管理者」とクリック> 1000順序を使用IMGSから選択*
+ ---- + ------------- + ------- + ------- + -------------- -  + -------- + --------- + ------ + ------ + ------------- +
| ID | SELECT_TYPE | 表| タイプ| possible_keys | キー| key_lenに| REF | 行| エクストラ|
+ ---- + ------------- + ------- + ------- + -------------- -  + -------- + --------- + ------ + ------ + ------------- +
| 1 | SIMPLE | IMGS | レンジ| クリック| クリック| 4 | NULL | 312 | |どこ使い方
+ ---- + ------------- + ------- + ------- + -------------- -  + -------- + --------- + ------ + ------ + ------------- +
セット内の1行(0.00秒)

 


結果セットに312は、許容される仕分け効率なければならないときに1000を加えました。
プログラムが行うことは非常に困難であるように、ユーザーIDの各値に対して、サンプリングポイントを見つけなければならないように、しかし、最適化された方法を使用して屈折率の変化は、この数は1000であるように、この例のように、サンプルポイントを取る必要がA。1000でサンプリングされた場合、ユーザID =「7mini」この例では、結果は8であると解釈されることはありませんが、二人は、混乱は、ユーザに起因しました。
もちろん、他の方法があり、インデックスは、ビス:
IMGSのインデックスuserid_clicksを作成(ユーザーID、クリック数)
MySQLの> DESCクリックのDESCの上限10でユーザーID =「管理者」ためIMGSから選択*;
+ ---- + ------------- + ------- + ------ + --------------- ------- + --------------- + --------- + ------- + ------ +  - ------------ +
| ID | SELECT_TYPE | 表| タイプ| possible_keys | キー| key_lenに| REF | 行| エクストラ|
+ ---- + ------------- + ------- + ------ + --------------- ------- + --------------- + --------- + ------- + ------ +  - ------------ +
| 1 | SIMPLE | IMGS | REF | ユーザーID、userid_clicks | userid_clicks | 51 | const | 2944 | |どこ使い方
+ ---- + ------------- + ------- + ------ + --------------- ------- + --------------- + --------- + ------- + ------ +  - ------------ +
セット内の1行(0.00秒)

 


そして、あなたが見ることができ、その結果は、設定またはストリップ2944が、filesortレコードはエクストラなくなって。その後userid_clicksにすばやくソートクリックに基づいてされているすべてのレコードをユーザーID =「管理者」、そして結果を見つけることができます!だから、メモリへの並べ替えを設定し、この結果を入れていないだけでなく、このインデックスを照会するためにMySQLを使用し、はるかに高い効率。
しかし、複数フィールドインデックスと、このように問題があり、SQLクエリ優しい言葉の多くは、あなたがそれを計画している場合、それ以外の指標は、挿入および更新データの効率だけでなく、データシートに影響するだけでなく、非常に建設されます損傷を受けやすいです。
これらは、インデックスの最適化アプローチです、理由はたいていうまくインデックスを最適化した後に、より複雑になるので、比較的長い書かれた可能性があるため、MySQLのn個の等級の効率を高めるませんので、問題を解決するためにマシンを追加することを検討する必要でしょう。
しかし、MySQLデータベース、あるいはすべてが、うまく制限の問題を解決しないかもしれません。MySQLでは、問題はない、右限り0,10インデックスを制限するが、MySQLは、結果の良いシーケンスを行スキャンしますので、非常に遅くなります100000,10を制限し、その後、10リターンを削除100000この点を見つけます。10万この点を見つけるために、10万件のレコードをスキャンする必要があり、このサイクルは、より多くの時間がかかります。私は私が何か良い方法を考えることができなかったと思いますしようと、スキャンエンジンを最適化するために何か良いアルゴリズムを持っていないだろうかわかりません。制限については、現在、より遠い将来まで、私は私だけでも万能薬ではないと思う方法を最適化され、事業計画、プログラムやデータテーブルによって最適化され、その後、後で議論することができると思います。
2、SQL文言は複雑すぎる
などGROUPBY、またはマルチテーブル共同問い合わせなど、いくつかの特別な機能、で使用される文言は、その後、どのような方法を照会するために使用mysqlはまた、DESCを分析するために使用することができるならば、私は複雑なSQLの場合とここにないんだけど、SQL何の良いアドバイスされていない、より多くのように、まれに分析を数えます。
3、設定エラー
主なパラメータは、これらの2つのパラメータの意味、key_buffer、sort_buffer_size / myisam_sort_buffer_sizeに構成されている:
key_buffer = 128M:すべてのテーブルは、それがわずかに大きい点を開くことができ、インデックスは比較的大きく、可能な限りこのメモリ領域インデックスに配置され、Iは通常128Mに設定し、良い提案がめったにmysqlは大幅にメモリフットプリントを削減することができるように、どこか別の場所に移動する方法を見つけるために使用されておらず、比較的大きなテーブルすることです。
sort_buffer_size = 1M:ソートに使用されるメモリのシングルスレッド、クエリの結果セットが比較的小さい、mysqlは少しそれに少しターンアップので、数回を置くならば、インデックスと良いを最適化することが重要である、このメモリーに入れられますクエリは、彼らが結果セットの多くを生成しないように。
その他の設定:
thread_concurrency = 8:この設定は、標準= CPU番号X2が来る
は、interactive_timeout = 30
WAIT_TIMEOUT = 30:これらの2つの構成は、これは注意して、できるだけ早くメモリリソースを解放し、それを10〜30秒を使用しています使用されてきました接続壊れていないが、この構成では、唯一の移動せずに長い時間のための接続を遮断します。
query_cache:この機能を使用しないでください、多くの人々は今、これは唯物ない、赤ちゃんを参照してくださいこれらのような手紙のキャッシュを参照してください。MySQLのquery_cacheテーブルデータの変更があるたびに、すべてのキャッシュに再接続されますテーブルをクリーンアップする、より頻繁な更新場合、query_cache助けないだけでなく、効率性に大きな影響。あなたが使用しなければならない場合、このパラメータは2、自己のSQL SQL_CACHEがquery_cache_type =といくつかのキャッシュを指定するだけで、読み取り専用のデータベースにのみ適しています。
MAX_CONNECTIONS:デフォルトは通常の状況下では、100では十分であるが、一般的に、あなたは一人でその数、増加して、600以上、そして一般的な効率を持つことができ、その上に400から600に、開いている大きなを開きたい、別の対策を見つける必要がありないソリューション。
設定は非常に重要ですが、1、ほとんどの場合、犯人は効率の問題ではありません。他の構成は、個人的に私はこの問題は、リマインダーそれほど大きくはないことを感じて、それをデフォルトにすることができます。図2は、MySQLはデータベースであり、最も重要な効率のためにデータベースが空想ではなく、データの安定性と精度。
4、それはマシンをロードすることはできません
あなたは上記の調整、サーバや余裕がないをすれば、それが唯一のアーキテクチャレベルを調整することによって最適化することができます。
1、MySQLの同期。
mysqlの同期で読み取るために、データベースから提供し、データベースからホストデータベースによって書かれたいくつかのデータを同期します。
このアプローチは、プログラムの複雑さを増加させ、そして多くの場合、誤ったデータ領域につながるので、個人的に私は、mysqlの同期を使用するにはあまりにも熱心ではないです。高負荷のサービスでは、クラッシュにも迅速に再起動することができますが、データが間違っている、あなたはより多くのトラブルを回復したいです。
図2は、キャッシュを追加することにより、
同時実行の問題を解決することができるキャッシュを追加した後、効果は明らかです。リアルタイムシステム場合は、キャッシュが最新に保つためのキャッシュウェイをフラッシュ使用することを検討してください。
イカアーキテクチャが使用することを提唱して参加する前に、アプリケーションの比較的高いヒット率では、基本的に問題を解決します。
キャッシュが増加するプログラム・ロジック層の内側にある場合は多くの問題の複雑さを解決することはより困難となり、このレベルでの調整をお勧めしません。
3、複数のデータベースを接続するプログラムの構造調整、サポート
Webキャッシュが問題に参加する場合は、複数のマシンで同時にサービスを提供するためのアプリケーションを壊すために、唯一のプログラムの構造調整を通じて、非常に深刻です。
あなたはそれを破るならば、ビジネスはほとんど影響で機能の一部は、すべてのデータを使用する必要がありますどのようなビジネスならば、あなたはこのようなアーキテクチャ分散ライブラリ、完全なライブラリ内の各変更の完全なライブラリ+ Nを使用して、一度ライブラリからのライブラリ操作に分散することができますまたは定期的に完全なライブラリを終えました。
もちろん、最も愚かなの一つがあり、データベース全体のコピーを作成することが損なわれて、その後、すべての時間は、プログラムがポーリングアクセスをアクセスして、これらのライブラリでは、完全なSQLを生き残る、私はセキュリティのMySQLの同期よりも、この方法を考えます。
mysqlのプロキシプロキシ使用して4、
MySQLのプロキシは、サーバーの数に、各テーブルのプロキシデータベースで分散しますが、このアプローチは、よりであるとの問題は、人気のあるコンテンツは、いくつかのテーブルに散在している場合、ホットテーブルの問題を解決することができないことができますこの問題を解決することが簡単にできます。
私は、このソフトウェアが真剣にチェックされていない使用していないが、私はその機能の少しは疑う持って、それが複数のテーブル間の共同調査を実装する方法?私たちが達成することができた場合、どのように?効率的である
5、使用memcachedbの
データベースMySQLのサポートをmemcachedbするためのスイッチは、アイデアを試すことができ、ビューの実装とmemcachedbポイントのレベルからのデータに影響はありません、ユーザーに何の問題もないでしょう。
私にとっては、今あるため、データベースの問題の多くは、このようなものをテストしていません。しかし、限り、それは主要な文法のMySQLのほとんどをサポートし、それ自体を安定させるよう、可用性を疑う必要はありません。

リンク:https://pan.baidu.com/s/1v5gm7n0L7TGyejCmQrMh2g  抽出コード:x2p5

Xの共有すること自由に、しかし重大な制約、リンクをクリックするか、リンクが検索に加えて、集団グループ番号失敗する936 682 608

おすすめ

転載: www.cnblogs.com/it-3327/p/11726265.html