推奨される学習: mysql ビデオ チュートリアル
Explain キーワードを使用して、SQL クエリ ステートメントを実行するオプティマイザをシミュレートします。 MySQL は、SQL ステートメントを処理し、クエリ ステートメントやテーブル構造のパフォーマンスのボトルネックを分析する方法です。
#最も重要なフィールドは次のとおりです: id、type、key、rows、Extra
クエリ内で選択句または操作テーブルが実行される順序を示す、一連の番号を含む選択クエリ シーケンス番号
3 つの状況:
1. 同じ ID: 上から下への実行順序
2. 異なる ID: 子の場合 クエリの場合、id の通し番号が大きくなり、id の値が大きいほど優先度が高く、より早く実行されます。
#3. ID は同じですが異なります (両方のケースが同時に存在します): ID が同じ場合、グループとみなされ、上から下へ順番に実行されます。すべてのグループで、ID 値が大きいほど優先順位が高く、より早く実行されます。
select_type
クエリのタイプは主に次の目的で使用されます。通常のクエリ、結合クエリ、サブクエリなどの複雑なクエリを区別します。
1、SIMPLE: 単純な選択クエリ。クエリにはサブクエリやユニオンが含まれません
アクセス タイプ、 SQL クエリの最適化における非常に重要な指標である、結果の値は最良から最悪まで次のとおりです。
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
: テーブルには 1 行のレコード (システム テーブルと同じ) しかありません。これは const 型の特殊なケースであり、通常は表示されず、次のようにすることができます。無視されます
2. const: インデックスを通じて 1 回見つかったことを意味し、const は主キーまたは一意のインデックスを比較するために使用されます。 1 行のデータを照合するだけなので、非常に高速です。主キーが where リストに配置されている場合、mysql はクエリを const
##3, eq_ref: For each の一意のインデックス スキャンに変換できます。インデックス キーに一致するのはテーブル内の 1 つのレコードのみです。主キーまたは一意のインデックスのスキャンでよく見られます。
注: t1 テーブル
4、refなど、レコードが最も少ないテーブルの全テーブル スキャン:非固有インデックス スキャンして、単一の値に一致するすべての行を返します。基本的に、これは単一の値に一致するすべての行を返すインデックス アクセスでもありますが、条件を満たす複数の行が見つかる場合があるため、検索とスキャンを組み合わせて行う必要があります
5, range: インデックスを使用して行を選択し、指定された範囲内の行のみを取得します。キー列は、どのインデックスが使用されているかを示します。一般に、bettween、、in などのクエリは where ステートメントに現れます。インデックス列に対するこの範囲スキャンは、完全なインデックス スキャンよりも優れています。インデックス全体をスキャンする必要はなく、特定のポイントで開始し、別のポイントで終了するだけで済みます。
6,index
: フル インデックス スキャン、インデックスおよび ALL 違いは、インデックス タイプがインデックス ツリーのみをトラバースすることです。インデックス ファイルは通常データ ファイルよりも小さいため、これは通常 ALL ブロックです。 (Index と ALL は両方ともテーブル全体を読み取りますが、index はインデックスから読み取られ、ALL はハードディスクから読み取られます)7, ALL
: フル テーブル スキャン。テーブル全体を走査して一致する行を検索します。 #possible_keysクエリに含まれるフィールドにインデックスがあり、インデックスはリストされますが、必ずしもクエリで使用されるわけではありません。 key実際に使用されるインデックス。NULL の場合、インデックスは使用されません。#カバリング インデックスがクエリで使用されている場合、インデックスはキー リストにのみ表示されます
1. filesort:
mysql の使用では、並べ替えではなく、外部インデックスを使用してデータを並べ替えます。テーブル内のインデックスはソートされた読み取りを実行します。つまり、mysql はインデックスを使用して「ファイルの並べ替え」になる並べ替え操作を完了することはできません。 インデックスは最初に電子メールによって並べ替えられ、次にアドレスによって並べ替えられるため、アドレスソートによって直接クエリを実行すると、インデックスは要件を満たすことができず、mysql は「ファイルソート」を再度実装する必要があります2. 一時テーブルの使用:
一時テーブルを使用して、中間結果を保存します。つまり、mysql はクエリ結果を並べ替えるときに一時テーブルを使用します。これは、order by および group by3 で一般的です。インデックスの使用:
Covering Index
(Covering Index) が対応する選択操作で使用され、テーブルのデータ行へのアクセスが回避され、非常に効率的であることを示します。 #Using where が同時に表示されている場合は、そのインデックスがインデックスキー値の検索に使用されていることを示します(上図参照)使用されておらず、「Using where」の場合同時に表示される場合は、インデックスが検索アクションの実行ではなくデータの読み取りに使用されることを示しますCovering Index (Covering Index):インデックスカバレッジと呼ばれます。選択リスト内のフィールドはインデックスからのみ取得できます。インデックスに従ってデータ ファイルを再度読み取る必要はありません。つまり、 クエリ列は構築されたインデックスでカバーされている必要があります 。
注:4. where の使用:
where フィルタリングの使用5. 結合バッファの使用:
リンク キャッシュの使用##6. 不可能な WHERE:where 句 値は常に false であり、先祖を取得するために使用することはできません
##7. 最適化されたテーブルを選択します:
group by なし 句の場合、インデックスに基づいて MIN/MAX 演算を最適化するか、MyISAM ストレージ エンジンの COUNT(*) 演算を最適化すると、計算を実行する実行フェーズまで待つ必要がありません。最適化は、クエリ実行プランの生成フェーズ中に完了できます
8. 個別:
個別の操作を最適化し、最初に一致する祖先を見つけた後は同等の価値のあるアクションの検索を停止します
1 (id = 4), [select id, name from t2]: select_typeはunion、idを指定=4 の選択は、結合内の 2 番目の選択です。
2 (id = 3), [select id, name from t1 where address = '11']: これは from ステートメントに含まれるサブクエリであるため、DERIVED (派生) としてマークされます。 = '11' は複合インデックス idx_name_email_address を通じて取得できるため、タイプはインデックスです。
3 (id = 2), [select id from t3]: select に含まれるサブクエリであるため、SUBQUERY とマークされます。
4 (id = 1), [select d1.name, … d2 from … d1]: select_type は PRIMARY です。これは、クエリが最も外側のクエリであり、テーブル列が「derived3」としてマークされていることを意味します。これは、クエリ結果が派生テーブルから取得されることを意味します (id = 3 の結果を選択)。
5 (id = NULL), [... Union...]: ユニオンの一時テーブルから行を読み取る段階を表します。テーブル列の「ユニオン 1, 4」は、id=1 およびユニオン 4 を意味します。 id=4 選択結果に対してユニオン演算を実行します。
推奨学習: mysql ビデオ チュートリアル
以上がMySQL で実行計画を表示する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。