My SQLクエリ計画の詳細

公開日: 2026-07-30 20:18 更新日: 2026-07-30 20:18 2332文字 12 min read ... ページビュー

この記事では、My SQLのEXPLAINクエリプランの使用方法と列の意味を詳しく説明し、SQL文の実行プロセスを分析するのに役立ちます。実行計画を見ることで、アクセスタイプ、インデックスの選択、スキャン行数、最適化の必要性を判断することができ、id、type、key、rows、filteredなどのキーフィールドに焦点を当て、実際の実行データ(EXPLAIN ANALYZEなど)と組み合わせた性能評価の重要性を強調しました。

My SQL EXPLAINクエリプランの詳細

EXPLAINは、My SQLがSQL 文に対して生成した実行計画を表示するために使用されます。実行プランでは、アクセス順序、インデックスの選択、スキャンの推定行数、ソート、一時テーブルなどの情報を分析できます。

DESCEXPLAINの違い

テーブル構造を見る

DESCDESCRIBEの略で、テーブルまたはビューのフィールド情報を表示します。

DESC employee;

DESCRIBE employee;

通常、2つの文には、フィールド名、データ型、NULLを許可するかどうか、インデックスタイプ、デフォルト値、および追加情報が表示されます。

SQL 実行プランの表示

クエリ文の前にEXPLAINを追加すると、オプティマイザが選択した実行プランを表示できます。

EXPLAIN
SELECT *
FROM employee
WHERE first_name = 'tom';
image-001
image-001

My SQLは他の出力形式もサポートしています。例えば、ツリー形式は実行順序を観察しやすいです。

EXPLAIN FORMAT=TREE
SELECT *
FROM employee
WHERE first_name = 'tom';

EXPLAIN ANALYZEはSQLを実際に実行し、推定値と実際の実行データを返します。更新文や削除文は、誤ってデータを変更しないように注意してください。

EXPLAIN ANALYZE
SELECT *
FROM employee
WHERE first_name = 'tom';

EXPLAIN共通のリスト

image-002
image-002

従来の表形式には、通常、次の列が含まれます。

リスト機能
idクエリブロック番号は、クエリブロック间の実行の判断にできる
select_typeクエリ·ブロックのタイプ単纯クエリ、メイン·クエリ、サブクエリ、抽出テーブルなど
table現在アクセスされているテーブル、別名、または内部一時結果
partitionsアクセスが予想されるパーティション。パーティションテーブルが使用されていない場合は通常NULL
typeテーブルアクセス方式は、インデックスの使用状況を判断する重要な指標です。
possible_keysオプティマイザが使用する可能性があると考えるインデックス
key実際に選択されたインデックス
key_len使用される予定のインデックス·キーの長さ(バイト単位)
refインデックス·カラムと比較される定数またはカラム
rowsオプティマイザチェックが必要なロー数の推定{{おぷてぃまいざちぇ っくが必要なロー数の推定}}
filtered現在のテーブル条件でフィルタ処理された後に予想される保持率
Extraソート、テンポラリ·テーブル、上書き索引などの補足情報

idクエリブロック番号

idは異なるクエリブロックを識別するために使用されますが、単純に絶対的な実行順序として扱うことはできません。

  • id同じ複数のローは、通常、同じクエリ·ブロックに属し、テーブルの表示順序は、そのジョイン·プラン内のアクセス順序を反映します。
  • idが異なることは、通常、サブクエリ、派生テーブル、またはUNIONなどの複数のクエリ·ブロックが存在することを示す。
  • 結果行によっては、idNULLになることもあります。たとえば、UNION RESULTです。

複雑なSQLの実際の実行は、FORMAT=TREEまたはEXPLAIN ANALYZEと組み合わせて判断する必要があります。

select_type問合せタイプ

通常値は以下の通り。

意味
UNIONまたはサブクエリを含まない単純なクエリ
PriMARY最も外側の検索
UNUNION内の2 番目以降のクエリブロック
DEPENDENT UNIONクエリの
`UNION RESULTUNION結果セット
SUBQUERY外部クエリに依存しないサブクエリ
DEPENDENT SUBQUERY外部クエリの結果に依存する関連サブクエリ
DERIVEDFROM句内の抽出テーブル{{FROMくないのしゅうせいてーぶる}}
MATERIALIZEDオブジェクト化後に再利用されたサブクエリ結果

table:オブジェクトへのアクセス

tableでは、一般にテーブル名またはテーブル別名が表示されます。オプティマイザによって生成される内部結果には、次の形式が表示されます。

  • <derivedN>番号Nの派生テーブルクエリブロックから。
  • &lt;unionM,N&gt;:番号MNなどのクエリブロックからのUNION結果.
  • `:オブジェクト化されたサブクエリの結果。

typeアクセス方法

typeは、My SQLがテーブルからデータを読み取る方法を説明します。以下に一般的な型を正確な順から広い順に示しますが、実際のパフォーマンスは返される行数、データ分布、キャッシュなどの要因にも影響されます。

タイプ摘要
system表は1 行のみと見なされ,constの特例である
constプライマリ·キーまたはユニーク·インデックスの同値一致により、最大 1つのローを返す
eq_refプライマリ·キーまたはNULLでないユニーク·インデックスによるジョイン時のマッチング。上位テーブルの組み合わせごとに最大 1ローがヒット
ref通常のインデックスまたはユニークなインデックスの不完全なプレフィックスによる等価検索。複数のローを返すことがある。
fulltext全文索引の使用
ref_or_nullrefに類似し、NULLを追加検索する
index_merge複数のインデックスのスキャン結果の結合
unique_subquery一部のINサブクエリはユニークなインデックスで検索されます
index_sub一部のINサブクエリはユニークでないインデックスで検索されます
rangeインデックスに対する範囲スキャンの実行
indexインデックス全体のスキャン
ALLテーブル全体をスキャン

ALLindexに焦点を当てて分析することが多い。しかし、小さなテーブル全体のスキャンは必ずしも問題ではなく、typeだけでSQLの最適化が必要かどうかを判断することはできません。

インデックス関連カラム{{いんでっくすかんすうからむ}}

possible_keys

オプティマイザが使用する可能性があると考えるインデックスを表示します。値NULLは、現在のクエリに明確に使用可能なインデックスがないことを示しますが、SQLにパフォーマンス上の問題があるとは限りません。

key

オプティマイザが最終的に選択したインデックスが表示されます。possible_keysに複数のインデックスがリストされている場合でも、keyには通常、実際に採用されたインデックスのみが表示されます。index_mergeを使用すると、複数のインデックスが表示される場合があります。

key_len

実行計画で使用されると予想されるインデックス·キーの長さが表示されますユニオンインデックスの場合、この値はどのインデックス列が使用されているかを判断するのに役立ちます。

key_lenは推定された最大長であり、実際に読み取られたデータの長さを表しません。文字セット、空可カラム、可変長フィールド、インデックス付きカラム型はすべてこの値に影響します。

ref

インデックス検索時に比較に使用される値を表示します。例えば:

  • const:定数と比較する.
  • 库名.表名.列名:別の表の列との比較。
  • func:式、関数の結果、または型変換が行われた値との比較。

rowsfiltered

rows

rowsは、オプティマイザがチェックする必要があると推定した行数であり、実際のスキャン行数ではありません。統計情報が不正確な場合、推定値にばらつきが生じる可能性がある。

filtered

filteredは、現在のテーブル条件によってフィルタリングされた後に保持されると予想されるデータの割合であり、パーセンテージで表されます。

次のステップに渡される行数は、次の方法で概算できます。

rows × filtered ÷ 100

実際の実行行数と時間を観察するには、EXPLAIN ANALYZEを使用してください。

Extra:補足情報

Extraの一般情報は以下の通りです。

情報説明
Using index必要なカラムは、上書きインデックスを使用して取得できます。通常、テーブルに戻る必要はありません
Using whereデータを読み込んだ後に条件に基づいてフィルタリングする必要があります
Using index conditionインデックス条件下プッシュを使用して、ストレージ·エンジン層でレコードの一部をフィルタリングする
Using filesortソートは適切なインデックスを直接利用できず、追加のソートが必要です。必ずしもディスクファイルに書き込まれません。
Using temporary内部テンポラリ·テーブルを使用した中間結果の保存(部分的なグループ化、重複除去、ソート操作でよく見られる)
Using join buffer接続プロシージャは接続バッファを使用します。通常は接続条件とインデックスのチェックが必要です。
Firstハーフジョイン最適化戦略の1つで、最初の一致が見つかったら検索を停止します。
LooseScan半接続最適化戦略の1つで、インデックスホップスキャンによる重複マッチングの削減
“Impossible WHERE”オプティマイザはクエリ条件が不可能であると判断

Extraは複数の情報を同時に表示できます。例えば:

Using index condition; Using where

基本分析の考え方

実行計画を解析するときは、次の順序でチェックできます。

  1. テーブルのアクセス順序が合理的であることを確認します。

  2. typeで、大きなテーブルのALLまたは不要なindexスキャンが発生していないかどうかを確認します。

  3. possible_keyskeyを比較して、インデックスが選択されていることを確認します。

  4. key_lenと合わせて連合インデックスの使用範囲を判断する.

  5. rowsfiltered、およびExtraのソート、テンポラリ·テーブル、および接続バッファ情報に注目します。

  6. 重要なSQLにEXPLAIN ANALYZEを使用して、実際の行数と時間で見積もりを検証します。

気に入ったならばコメントを残してくださいね~

... ページビュー
© 2026 跨越星轨的客 @Hoshiumi
Powered by theme astro-koharu · Inspired by Shoka