はじめに
前回の記事では、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 temporary や Using filesort が出ている場合は、注意が必要です。
MySQL まとめ
typeは最も重要。ALLを避けることが基本keyがNULLの場合、インデックスが使われていない可能性ありrowsとfilteredの組み合わせで負荷を予測できるExtraにUsing filesortやUsing temporaryが出たら要注意
次回のテーマ
今回はEXPLAINを確認したので次回はMySQL8.0から実装されたEXPLAIN ANALYSISをいじってみたいと思います。
