Tech Starlog

MySQL EXPLAIN

投稿日:2026/02/03

本記事では、MySQLのEXPLAINを使ってSQLの実行計画を読み解く方法を必要なポイントに絞って解説します。


EXPLAINとは?

EXPLAIN は、SQLがどのように実行されるかを事前に確認するためのコマンドです。

EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';

これにより、

  • どのテーブルを
  • どんな順序で
  • どのインデックスを使って
  • どれくらいの行を読むか

を確認できます。


なぜEXPLAINが重要なのか?

SQLが遅くなる原因の多くは、

  • インデックスが使われていない
  • 無駄に大量の行を読んでいる
  • JOIN順が最適でない

といった 実行計画の問題 です。

👉 EXPLAINを見れば、これらが一目で分かります。


EXPLAINの基本的な見方

EXPLAIN SELECT * FROM posts WHERE user_id = 1;

出力例(簡略)

項目 意味
id 実行順
select_type クエリの種類
table 対象テーブル
type アクセス方法(重要)
key 使用インデックス
rows 読み込む行数(目安)
Extra 追加情報

type(最重要)

typeSQLの良し悪しを判断する最重要項目 です。

type 意味 評価
system / const 1行だけ
eq_ref PK/UKでJOIN
ref インデックス検索
range 範囲検索
index インデックス全走査
ALL 全表走査

例:良いEXPLAIN

EXPLAIN SELECT * FROM users WHERE id = 1;
type: const
key: PRIMARY
rows: 1

例:悪いEXPLAIN

EXPLAIN SELECT * FROM users WHERE name = 'Taro';
type: ALL
rows: 100000

👉 全件スキャンしている


key / possible_keys

項目 説明
possible_keys 使えそうなインデックス
key 実際に使われたインデックス

よくある罠

  • possible_keys にあるのに key が NULL
  • インデックスが使われていない

rows の見方

rows は、MySQLが読むと予想している行数 です。

rows: 100000
  • 👉 重いSQLのサイン
  • 👉 インデックス追加・条件見直しが必要

Extra に出たら要注意な表示

Extra 意味
Using filesort ソートが重い
Using temporary 一時テーブル使用
Using where 条件フィルタ
Using index カバリングインデックス

特に注意

  • Using filesort
  • Using temporary

パフォーマンス劣化の原因


JOINとEXPLAIN(実務超重要)

EXPLAIN
SELECT posts.title, users.name
FROM posts
INNER JOIN users
ON posts.user_id = users.id;

ポイント

  • JOINキーにインデックスがあるか
  • JOIN順が適切か
  • typeALL になっていないか

よくある改善パターン

① WHERE句にインデックスを貼る

CREATE INDEX idx_users_email ON users(email);

② SELECT * をやめる

SELECT id, email FROM users WHERE email = 'test@example.com';

③ LIKEの使い方に注意

-- NG
WHERE name LIKE '%tanaka%'

-- OK
WHERE name LIKE 'tanaka%'

EXPLAIN ANALYZE(MySQL 8.0〜)

実際の実行時間を確認できます。

EXPLAIN ANALYZE
SELECT * FROM users WHERE email = 'test@example.com';
  • 推定値 vs 実測値の比較
  • 本番調査で非常に有用

Laravelでの使いどころ

  • クエリログ調査
  • パフォーマンス改善
  • N+1問題の確認
  • インデックス設計

Eloquentで書いたSQLも、 最終的にはEXPLAINで確認 するのが実務です。


EXPLAINを見るときのチェックリスト

  • type が ALL になっていないか
  • key が NULL ではないか
  • rows が異常に多くないか
  • Using filesort / temporary が出ていないか

まとめ

MySQLのEXPLAINは、

  • 遅いSQLの原因を特定
  • 改善ポイントを見つける
  • 安心して本番に出す

ための 必須スキル です。

まずは、

「遅いかも?」と思ったらEXPLAIN

この習慣を身につけるだけで、 SQLの質は確実に上がります。