mysql(4)-sql最適化のexplain構文の詳細
5499 ワード
EXPLAINは、SELECT文に使用されるテーブルごとに1行の情報を返します.テーブルは、クエリの処理中にMySQLに読み込まれる順序でリストされます.MySQLは、複数の結合(single-sweep multi-join)を一度にスキャンすることで、すべての結合を解決します.これは、MySQLが最初のテーブルからローを読み、2番目のテーブルで一致するローを見つけ、3番目のテーブルなどを意味します.すべてのテーブルが処理されると、選択したカラムが出力され、より多くの一致するローがあるテーブルが見つかるまでテーブル・リストに戻ります.このテーブルから次の行を読み込み、次のテーブルの処理を続行します.
EXTENDEDキーワードを使用すると、EXPLAINは追加情報を生成し、SHOW WARNINGSで閲覧することができる.この情報は、オプティマイザがSELECT文のテーブルとカラム名を定義し、最適化ルールを書き換えて実行した後にSELECT文がどのようになるかを示し、最適化プロセスの他の注釈も含まれる可能性があります.
EXPLAINの各出力行は、テーブルに関する情報を提供し、各行は次の列を含む.id:SELECT識別子.これはSELECTの照会シリアル番号です. select_type:SELECTタイプは、以下のいずれかです. SIMPLECT:簡易SELECT(UNIONまたはサブクエリを使用しない) PRIMARY:一番外側のSELECT UNION:UNIONの2番目または後のSELECT文 DEPENDENT UNION:UNIONの2番目または後のSELECT文は、外のクエリに依存する ユニオンRESULT:ユニオンの結果. SUBQUERY:サブクエリの最初のSELECT DEPENDENT SUBQUERY:サブクエリの最初のSELECTは、外部クエリによる DERIVED:エクスポートテーブルのSELECT(FROM句のサブクエリ) table:出力された行が参照するテーブル. type:結合タイプ.次に、最適なタイプから最悪のタイプにソートする結合タイプを示します. system:テーブルは1行のみ(=システムテーブル).これはconst結合タイプの特例です. const:クエリの開始時に読み込まれる一致するローが最大1つあります.1行しかないため、この行の列値はオプティマイザの残りの部分で定数とみなすことができる.constテーブルは1回しか読み込まないので速いです!constは、PRIMARY KEYまたはUNIQUEインデックスのすべての部分を定数値で比較する場合に使用します.eq_refは、=オペレータ比較のインデックス付きカラムを使用することができます.比較値は、定数またはテーブルの前に読み込まれたテーブルを使用するカラムの式です. eq_ref:前のテーブルからの行の組合せごとに、そのテーブルから1行を読み出します.これはconstタイプを除いて最良の結合タイプかもしれません.1つのインデックスのすべての部分で結合されて使用され、インデックスはUNIQUEまたはPRIMARY KEYです.eq_refは、=オペレータ比較のインデックス付きカラムを使用することができます.比較値は、定数またはテーブルの前に読み込まれたテーブルを使用するカラムの式です. ref:前の表からの行の組み合わせごとに、一致するインデックス値を持つすべての行がこの表から読み出されます.結合がキーの左端の接頭辞のみを使用する場合、またはキーがUNIQUEまたはPRIMARY KEYでない場合(換言すれば、結合がキーに基づいて単一のローを選択できない場合)はrefを使用します.使用するキーがわずかなローにしか一致しない場合は、この結合タイプが良いです.refは、=または<=>オペレータのインデックス付きカラムを使用することができます. ref_or_null:この結合タイプはrefと似ていますが、MySQLを追加するとNULL値を含む行を特定できます.この結合タイプの最適化は、サブクエリの解決によく使用されます. index_merge:この結合タイプは、インデックス集計最適化メソッドが使用されていることを示します.この場合、key列には使用するインデックスのリストが含まれています.key_lenには、使用するインデックスの最も長いキー要素が含まれています.詳細については、7.2.6節、「インデックス連結最適化」を参照してください. unique_subqueryこのタイプは、次の形式のINサブクエリのrefを置き換えます: index_subquery:この結合タイプはunique_に似ています.subquery.INサブクエリは置換できますが、次の形式のサブクエリのユニークでないインデックスにのみ適用されます. range:与えられた範囲のローのみを取得し、1つのインデックスを使用してローを選択します.key列には、どのインデックスが使用されているかが表示されます.key_lenには、使用するインデックスの最長キー要素が含まれます.このタイプではref列はNULLです.=、<>、>、>=、、BETWEENまたはINオペレータを使用してキーワード列を定数で比較する場合は、range: index:この結合タイプはALLと同じであり、インデックスツリーのみがスキャンされる.これは、インデックス・ファイルが通常データ・ファイルより小さいため、ALLよりも高速です.クエリが単一インデックスの一部であるカラムのみを使用する場合、MySQLはこの結合タイプを使用できます. ALL:前のテーブルからの行の組み合わせごとに完全なテーブルスキャンを行います.テーブルがconstにマークされていない最初のテーブルである場合、これは通常よくなく、通常はその場合に悪い.通常、ALLを使用するのではなく、より多くのインデックスを追加して、前のテーブルの定数値またはカラム値に基づいてローを取得できます.
possible_keys:possible_keys列は、MySQLがテーブルにローを見つけるためにどのインデックスを使用できるかを示します.なお、この列はEXPLAIN出力に示すテーブルの順序とは完全に独立している.これはpossible_keysのいくつかのキーは、実際には生成されたテーブルの順序で使用できません.カラムがNULLの場合、関連するインデックスはありません.この場合、WHERE句が特定の列またはインデックスに適した列を参照しているかどうかを確認することで、クエリーのパフォーマンスを向上させることができます.もしそうであれば、適切なインデックスを作成し、EXPLAINでクエリーを再度チェックします. key:key列MySQLが実際に使用を決定したキー(インデックス)が表示されます.インデックスが選択されていない場合は、キーはNULLです.MySQLにpossibleの使用を強制または無視するにはkeys列のインデックスは、クエリーでFORCE INDEX、USE INDEX、またはIGNORE INDEXを使用します. key_len:key_len列にはMySQLが使用するキーの長さを決定します.キーがNULLの場合、長さはNULLです.注意key_len値は、MySQLが実際に複数のキーワードのいくつかの部分を使用することを決定します. ref:ref列は、keyとともにテーブルから行を選択する列または定数を表示します. rows:rows列MySQLがクエリを実行する際にチェックしなければならないと考えているローの数を表示します. Extra:この列にはMySQL解決クエリの詳細が含まれています.列に表示できる異なるテキスト文字列について説明します. Distinct:MySQLが1番目に一致する行を発見した後、現在の行の組合せについてより多くの行を検索することを停止します. Not exists:MySQLはクエリをLEFTJOIN最適化することができ、LEFTJOIN規格に一致する1つの行を発見した後、前の行の組み合わせのためにこの表内でより多くの行をチェックしなくなった. range checked for each record(index map:#):MySQLでは使用可能なインデックスは見つかりませんでしたが、前のテーブルからのカラム値が既知であれば、一部のインデックスが使用可能である可能性があります.前のテーブルの行の組合せごとに、MySQLがrangeまたはindex_を使用できるかどうかを確認します.mergeアクセスメソッドは、ローを要求します. Using filesort:MySQLは、ソート順にローを取得する方法を見つけるために追加のパスが必要です.ソートは、結合タイプに従ってすべてのローを参照し、WHERE句に一致するすべてのローに対してソートキーとローのポインタを保存することによって完了します.キーワードがソートされ、ソート順にローが取得されます. Using index:インデックスツリーの情報のみを使用し、実際のローをさらに検索することなくテーブルのカラム情報を取得します.このポリシーは、クエリが単一のインデックスの一部であるカラムのみを使用する場合に使用できます. Using temporary:クエリを解決するために、MySQLは結果を格納するための一時テーブルを作成する必要があります.通常、クエリに列を異なる状況でリストできるGROUP BYおよびORDER BY句が含まれている場合. Using where:WHERE句は、次のテーブルに一致する行または顧客に送信する行を制限するために使用されます.テーブルからすべてのローを要求またはチェックしない限り、Extra値がUsing whereではなく、テーブル結合タイプがALLまたはindexの場合、クエリにエラーが発生する可能性があります.クエリーをできるだけ速くするには、Using filesortとUsing temporaryのExtra値を見つけます. Using sort_union(...), Using union(...), Using intersect(...):これらの関数はindex_の方法を示しています.merge結合タイプ連結インデックススキャン. Using index for group-by:テーブルにアクセスするUsing index方式と同様に、Using index for group-byはMySQLがGROUP BYまたはDISTINCTクエリのすべての列を検索するためにインデックスを発見したことを示し、ハードディスクアクセスの実際のテーブルを追加的に検索しないでください.また、インデックスは最も効果的な方法で使用され、グループごとに少量のインデックスエントリのみが読み込まれるようにします.
filtered:explain extendedを使用するとこの列が表示され、5.7以降のバージョンではデフォルトでこのフィールドがあり、explain extendedを使用する必要はありません.このフィールドは、ストレージエンジンが返すデータがserverレイヤでフィルタリングされた後、クエリのレコード数を満たす割合を示し、パーセンテージであり、特定のレコード数ではないことに注意します.
EXTENDEDキーワードを使用すると、EXPLAINは追加情報を生成し、SHOW WARNINGSで閲覧することができる.この情報は、オプティマイザがSELECT文のテーブルとカラム名を定義し、最適化ルールを書き換えて実行した後にSELECT文がどのようになるかを示し、最適化プロセスの他の注釈も含まれる可能性があります.
EXPLAINの各出力行は、テーブルに関する情報を提供し、各行は次の列を含む.
value IN (SELECT primary_key FROM single_table WHERE some_expr)
unique_subquery , , 。
value IN (SELECT key_column FROM single_table WHERE some_expr)
SELECT * FROM tbl_name WHERE key_column = 10;