高性能はmysql-第VI章クエリのパフォーマンスの最適化(1)

クライアントからサーバにし、サーバー上で解析し、実行計画、実行、およびクライアントに結果を返す:一般的に言って、クエリのライフサイクルは、ビューの順に大まかにすることができます。

MySQLのための3つの指標、クエリのコストの最も簡単な対策は次のとおりです。
応答時間
走査線の数
返される行数
基本的なクエリの実行:
クライアントがサーバにクエリを送信します。
キャッシュヒットであればサーバーを最初にチェッククエリキャッシュは、その後すぐにキャッシュに保存された結果を返します。そうでなければ、次のステージに進みます。
SQLサーバ側、前処理、およびオプティマイザによって生成され、対応する実行プランを解析します。
オプティマイザによって生成されたMySQLの実施計画によると、ストレージエンジンのAPIは、クエリを実行するために呼び出します。
結果がクライアントに返されます。
状態を確認します。
スリープ:スレッドが新しい要求を送信するためにクライアントを待っています。
問合せ:スレッドがクエリを実行しているか、クライアントに結果を送信しています。
ロック:MySQLサーバ層では、スレッドがテーブルロックを待っています。
分析と統計:スレッドは統計情報ストレージエンジンを収集することで、クエリの実行プランを生成します。
[ディスク上の表をtmpにするコピー:スレッドは、クエリを実行して、結果セットを一時テーブルにコピーされ、この状態は、いずれかの操作をソートファイル、またはUNION操作のいずれかをGROUP BY操作を行う一般的です。この状態バックがマーク「ディスク上」場合、それは、MySQLはディスク上のメモリに一時テーブルであることを意味しています。
結果の並べ替え:スレッドが結果セットをソートすることです。
データを送信する:これは、さまざまな状況を表す:スレッドは、複数の状態の間でデータを転送する、または結果セット、またはクライアントに返されたデータを生成してもよいです。
MySQLの2つのソートアルゴリズムがあります。
2つの送信順序(古いバージョン):
ソートそれらは、次いで、所望のソート結果に応じてデータ行を読み取る、ソートに行ポインタフィールドと必要性を読み取ります。
シングル転送ソート(新バージョン):
まず、クエリのために必要なすべての列を読み、その後、特定の列に基づいてソートし、最終的に結果をソートするために直接戻りました。
ヒントクエリオプティマイザ(ヒント):
HIGH_PRIORITY和LOW_PRIORITY
このヒントは、複数のステートメントを同時に特定のテーブルにアクセスするMySQLの、ステートメントは、ステートメントが比較的低く、比較的高い優先度であるの優先順位を伝えます。
SELECT文のためのときHIGH_PRIORITYすべてがこの文SELECT文でデータを変更するロックを待機されるまで、MySQLはテーブルに再スケジュールされます。HIGH_PRIORITYはまた、INSERT文に使用することができ、効果はグローバル設定LOW_PRIORITY文の影響を相殺するだけです。
LOW_PRIORITYは正反対である:それは文が待機状態になっています、でも、それらの文よりも文は、後でサーバーに送信することを----長い行列が同じ文のテーブルにアクセスする必要があります。
どちらのアイデアは、テーブルロックのストレージエンジンを使用するためにのみ有効です。
遅延
このヒントは、INSERTおよびREPLACE有効です。MySQLは、クライアントにすぐにプロンプ​​ト文のリターンを使用して、バッファに挿入された行に配置され、その後、アイドル状態のバッチテーブルにデータを書き込みます。
STRAIGHT_JOIN
このチップはSELECTキーワードSELECT文で配置することができた後に、それはまた、テーブルを関連付けられている任意の2名の間に配置することができます。最初は彼らは声明の中で表示される順序に関連したクエリ内のすべての表を利用することです。二番目のルールは、二つのテーブルの前後に固定シーケンスに関連付けられています。
SQL_SMALL_RESULT和SQL_BIG_RESULT
これら二つのアイデアは、SELECT文に対してのみ有効です。彼らは、GROUP BYまたは一時テーブルやソートを使用する方法DISTINCTクエリの最適化プログラムを教えてください。結果は非常に小さいラリーであることをオプティマイザに伝えるSQL_SMALL_RESULT、結果セットが並べ替え操作を避けるために、インデックステーブルに一時的にメモリに配置することができます。SQL_BIG_RESULTは、結果セットが非常に大きくなる可能性があることをオプティマイザに伝える場合は、ディスクソート操作を行うために一時テーブルを使用することをお勧めします。
SQL_BUFFER_RESULT
このヒントは、一時テーブルにオプティマイザプットクエリ結果を伝え、その後、できるだけ早くとしてのテーブルのロックを解除します。
SQL_CACHE和SQL_NO_CACHE
このヒントは、これはクエリキャッシュにキャッシュされるべきかどうかのMySQLの結果セットを伝えます。
SQL_CALC_FOUND_ROWS
これは、結果セットがより多くの情報が含まれているMySQLのリターンを行います。MySQLのクエリに加えて、全体の迅速な除去が返されるクエリ結果セットのLIMIT句の後に計算され、実際に結果セットのみのLIMIT要件を返します。この値は()関数FOUND_ROWによって得ることができます。
FOR UPDATE和LOCKのIN SHAREモード
これは、SELECT文の二つの主要なロック制御機構を促したが、行レベルロックストレージエンジンを達成するための唯一の有効な。クエリのロック列にマッチしますヒントを使用してください。
USE INDEXは、INDEX和FORCE INDEXをIGNORE
これらのヒントは、オプティマイザが使用するか、どのクエリレコードにインデックスを使用しません教えてくれます。
MySQL5.0の以降では、オプティマイザの動作を制御するために使用されるパラメータのいくつかを追加します。
optimizer_search_depth
このパラメータのコントロールは徹底的実施計画におけるオプティマイザを制限します。
optimizer_prune_level
このパラメータは、オプティマイザがスキャンする行数に基づく実施計画の一部をスキップするかどうかを決定するなり、デフォルトで有効になっています。
optimizer_switch
この変数は、フラグオプティマイザ特性オン/オフの数を含んでいます。

おすすめ

転載: www.cnblogs.com/zhishuiyushi/p/12444482.html