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(最重要)
type は SQLの良し悪しを判断する最重要項目 です。
| 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 filesortUsing temporary
→ パフォーマンス劣化の原因
JOINとEXPLAIN(実務超重要)
EXPLAIN
SELECT posts.title, users.name
FROM posts
INNER JOIN users
ON posts.user_id = users.id;
ポイント
- JOINキーにインデックスがあるか
- JOIN順が適切か
typeがALLになっていないか
よくある改善パターン
① 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の質は確実に上がります。