MySQL EXPLAIN出力の各カラムを解説(type, key, Extraなど)

はじめに

前回の記事では、EXPLAINとEXPLAIN ANALYZEの基本的な使い方を紹介しました。今回は、EXPLAINの出力結果に含まれる各カラムの意味を丁寧に解説していきます。

これらのカラムを正しく読み解くことで、クエリの実行効率やボトルネックの特定が格段にしやすくなります。

MySQLは8.4.5を利用しています。


EXPLAINの基本構成

EXPLAINを実行すると、以下のようなテーブル形式の出力が返されます。

EXPLAIN
SELECT
    U.name,
    O.total
FROM
    users AS U
INNER JOIN
    orders AS O
    ON U.id = O.user_id;
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE O NULL ALL NULL NULL NULL NULL 29448 100.00 Using where
1 SIMPLE U NULL eq_ref PRIMARY PRIMARY 4 testdb.O.user_id 1 100.00 NULL

重要なカラムの意味と読み方

type:結合タイプ(アクセス方法)

このカラムは、テーブルへのアクセス方法を示します。パフォーマンスに最も影響する重要な指標です。

type 意味
ALL フルテーブルスキャン(最も遅い)
index インデックスの全走査
range インデックスの範囲検索
ref インデックスに基づく複数行の検索
eq_ref インデックスを使った単一行の結合(最も効率的)
const / system 1件の行を直接取得(最も高速)

基本的に、ALL → const の順で効率が良くなります。


key:実際に使用されたインデックス

このカラムには、クエリで使用されたインデックスの名前が表示されます。NULLであれば、インデックスが使用されていないことを意味します。

  • インデックスを貼ってもここがNULLであれば意味がない
  • 適切なWHERE句やJOIN条件が指定されていない可能性あり

possible_keys:利用可能なインデックス候補

このカラムには、クエリ実行時に使える可能性があるインデックスが表示されます。

  • keyがNULLでも、ここに候補が出ていれば最適化の余地あり
  • ここもNULLなら、そもそも使えるインデックスがない可能性が高い

rows:読み込まれる行数の見積もり

MySQL が「このテーブルから何件読み取ることになるか」と予測した行数です。

  • ここが多ければ多いほど、負荷がかかる可能性がある
  • 実際の件数と大きくずれる場合は EXPLAIN ANALYZE の活用がおすすめ

filtered:WHERE句などで残る行の割合

クエリの条件で「何%のレコードが残るか」を示します。100.00なら、全件が対象ということです。

  • rows × filtered ÷ 100 ≒ 実際に処理される行数

Extra:その他の補足情報

最も重要なカラムの一つです。ここにはクエリの詳細な処理内容が表示されます。

Extra 意味
Using where WHERE句でフィルタ処理が行われている
Using index カバリングインデックスが使用されている
Using temporary 一時テーブルを使っている(遅い可能性あり)
Using filesort ファイルソート(ORDER BYなどで遅くなりがち)
NULL 特に補足なし(シンプルな処理)

ここに Using temporaryUsing filesort が出ている場合は、注意が必要です。


MySQL まとめ

  • typeは最も重要。ALLを避けることが基本
  • keyがNULLの場合、インデックスが使われていない可能性あり
  • rowsfilteredの組み合わせで負荷を予測できる
  • ExtraUsing filesortUsing temporaryが出たら要注意

次回のテーマ

今回はEXPLAINを確認したので次回はMySQL8.0から実装されたEXPLAIN ANALYSISをいじってみたいと思います。