記事のディレクトリ
MySQLは、SELECT文と接続テーブルに対処するために、インデックスをどのように使用するかを示していEXPLAIN。あなたはより良い指標を選択して、より最適化されたクエリを記述することができます。
推奨読書
- MySQL5.7データベースをインストールLINUX
- MySQLのインデックスオプションと故障集計の一般的な原因は、あなたがこれらを知っている必要があります
- データベースのインデックス(指数)の実装原理、面接は頻繁に尋ね~~~
- 接続のMySQLのJOINの性能を最適化する(図あり、最も完全な最も詳細)
- MySQLの高度なパフォーマンスの最適化の知識、これらのインタビューでは、多くの場合、あなたは何を知っていますか尋ねますか?
説明します
クエリ実行プラン
- 使用キーワード説明は、SQL文のオプティマイザの実行をシミュレートすることができます
- 我々は、MySQL、SQL文で対処する方法を知っているので、
- あなたは説明することによって、パフォーマンスのボトルネックのクエリまたはテーブルの構造を分析することができます
効果
- テーブルの読み取り順序をチェック
- データは操作の操作タイプを読み取ります
- あなたが使用できるインデックスを参照してください。
- 実際に使用されたインデックスを参照してください。
- テーブル間の参照をチェック
- オプティマイザが実行される行数をテーブルごとにチェック
使用
- :次のようなSELECTステートメントを、EXPLAIN追加する前に
分析には情報が含まれています
ID
- SELECT識別子。これは、SELECTクエリのシリアル番号です。
EXPLAIN SELECT * FROM department d,
(SELECT * FROM employee GROUP BY dep_id) t
WHERE d.id = t.dep_id;
- 実行の表の順番:
employee
- >d
- ><derived2>
- 概要:
id相同,顺序走;不同,看谁大,大的先执行
。
SELECT_TYPE
- タイプを選択し、次のいずれかとすることができます。
SIMPLE
:単純なSELECTクエリは、クエリは、サブクエリやUNIONが含まれていませんPRIMARY
:クエリが複雑なサブクエリが含まれている場合は、最も外側のクエリはプライマリとしてマークされました。UNION
:第二組合後に生じる選択し、組合を標識した場合、組合from句のクエリがサブに含まれている場合、外側の層は、選択導出手段としてマークされますDEPENDENT UNION
:お問い合わせの外に応じて、2番目のSELECTステートメントまたはバックでUNION、UNION RESULT
:取得結果は、労働組合のテーブルから選択し、UNIONは最終的に2つの結果セットをマージSUBQUERY
:選択またはどこででサブクエリが含まれています。DEPENDENT SUBQUERY
第一のサブクエリはSELECT、外側の問い合わせに応じてDERIVED
:リストに含まサブクエリが派生(デリバティブ)としてマークされていることから、一時テーブルに結果を配置しています
テーブル
- 参照されるテーブルの行出力(テーブルの行に関連する表示データ)
パーティション
- パーティションテーブル(クエリがパーティションテーブルに基づいている場合、それはパーティションの照会アクセスが表示されます)
タイプ
system
:表のみ一列(=システムテーブル)。これは、const結合型の特殊なケースです。const
:比較のために、一致するライン、constの主なまたは一意索引アップテーブル。クエリの開始時に読み込まれます、主キーまたは一意索引に直接アクセス。唯一の行ので、この行の列の値は、残りの部分が一定で最適化するように考えることができます。constのテーブルに迅速彼らは一度だけ読まれているので!eq_ref
:ユニークなインデックススキャン。各インデックスキーの場合、テーブルの試合で1つのレコードのみ。主キーまたは一意索引スキャンでは共通しているのは、テーブルの前のレコードの組み合わせのそれぞれに対して、テーブルから行を読み取ります。これは、const型を除いて、おそらく最良の接続タイプです。ref
:非ユニークインデックス・スキャン。前述のテーブルからの行の組み合わせごとに、インデックス値に一致するすべての行がこのテーブルから読み出します。ref_or_null
:接続REFとしてタイプが、MySQLは、特に検索NULL値を含むことができる行を追加しました。index_merge
:結合型表示指標組み合わせ最適化方法。unique_subquery
:参考このタイプは、サブクエリで、以下のフォームを置き換える:value IN (SELECT primary_key FROM single_table WHERE some_expr) unique_subquery
インデックス検索機能を、完全にサブクエリは、より効率的に置き換えることができます。index_subquery
このタイプは、結合unique_subqueryと同様です。INサブクエリはなく、唯一の非ユニークインデックスの形でサブクエリのため、交換することができます。value IN (SELECT key_column FROM single_table WHERE some_expr)
range
:行だけを選択するためにインデックスを使用して、与えられた範囲の行を検索します。index
:インデックスツリーのみがスキャンされることを除いて同じ型を持つすべてのカップリング。インデックスファイルはデータファイルよりも通常小さいので、これは、より速くALLより通常です。ALL
:前の表からの行の組み合わせごとに、全表スキャン。
要件は、一般に、少なくともrefに好ましくは、クエリ範囲のレベルことを保証するために
possible_keys
- このインデックスのアプリケーションは、表1つ以上に表示することができ、クエリインデックスが存在する場合分野に関し、インデックスが記載されているが、必ずしも実際のクエリで使用されないであろう
キー
- インデックスは、実際に使用され、nullの場合、インデックスを使用しないでください。カバーするインデックスを使用してクエリは、インデックスがキーだけのリストに表示された場合は、
possible_keys与key关系 :理论应该用到哪些索引,实际用到了哪些索引;
インデックスとクエリフィールドでカバーフィールドはちょうどフィットを作成し、我々はカバー呼んでいますインデックス。
key_lenに
- インデックスに使用されるバイトの数、インデックスがクエリの長さで使用することができるが、列によって算出されていることを示します。キーがNULLの場合、長さはNULLです。
REF
- 列または定数は行を使用してテーブルからキーと一緒に選択される示します。インデックスは、インデックスには、いくつかの言及最後に、に導入されているかどうか
行
- MySQLは、クエリの実行を検討しなければならないと考えている行の数を表示します。複数のライン間でのデータの処理すべき行数を乗算することによって推定することができます。統計表によると、インデックスの場合、見つけるために読み取られる行の必要なレコード数の概算を選択し、どのように多くの行をテーブルごとに長い、あまりにもクエリを最適化されています。
フィルタ
- ショーの条件を介して濾過した行数の推定値の割合。、クエリを満たす割合ではなく、レコードの特定の番号をメモするレコード数の割合、より良い値は、フィルタ列の値は、統計が非常に正確ではありません依存しています。
エクストラ
- この列には、解決の詳細にMySQLのクエリが含まれています
Distinct
:MySQLは複数の行のための現在の行の組み合わせ停止検索のためのマッチラインの後に見つかりました。Not exists
:MySQLのLEFTは試合がLEFTを発見された後、標準的なライン、行の上記の組み合わせのチェックテーブルにもう行を結合、クエリ最適化することができ、JOIN。range checked for each record (index map: #)
:MySQLは全く良いインデックスを使用しないことができるが見つかりましたが、テーブルの列の正面から求めた値が既知であれば、インデックス部分を使用することができます。Using filesort
:MySQLはソートされた順序で行を取得する方法を見つけるために、追加の1パスが必要です。Using index
:さらに検索することなく、インデックスツリー内の情報のみを使用することから、テーブルの列情報を取得するための実際の行を読み取ります。Using temporary
:クエリを解決するために、MySQLは結果を保持するために一時テーブルを作成する必要があります。Using where
:WHERE句は、クライアントに次のテーブルまたは送信と一致する行を制限します。Using sort_union(...), Using union(...), Using intersect(...)
:これらの関数は、index_mergeがタイプマージインデックス・スキャンに参加する方法を示しています。Using index for group-by
:インデックスアクセスリストと同様の方法を使用して、グループごとの表現のMySQLのインデックスを使用すると、すべての列GROUP BYまたはDISTINCTクエリを照会するために使用することができ、インデックスではなく、追加の検索あなたのハードディスクが実際のテーブルにアクセスすることを発見しました。
より多くのあなたが知っている、より多くのあなたは知りません。
手術をせずに適切な方法は、患者はまだ手術を終了し、手術する方法はありません、求めることができます。
あなたが他の質問がある場合は、ウェルカムメッセージ、我々は、議論一緒に学び、一緒に進行することができます