【えくすぷれいん】

EXPLAIN(実行計画) とは?

💡 SQLが「どう実行されるか」を見える化するコマンド
📌 このページのポイント
EXPLAIN(SQLの実行計画) EXPLAIN SELECT * FROM users WHERE age > 20 ORDER BY name; クエリ オプティマイザ 実行計画 最適な手順 実行計画ツリー Sort (name) Filter (age > 20) Full Table Scan 🐌 Index Scan 🚀 注目ポイント: type: ALL(全件走査) rows: 推定処理行数 key: 使用インデックス
EXPLAIN(実行計画)のイメージ
ひよこ ひよこ

EXPLAINってどう使うの?

ペンギン先生 ペンギン先生

SQLの前に「EXPLAIN」を付けるだけ。「EXPLAIN SELECT * FROM users WHERE email = 'test@example.com'」で、このSELECTがどう実行されるかの計画が表示される。MySQLなら「EXPLAIN ANALYZE」で実際に実行した上で実測値も見られるよ。

ひよこ ひよこ

実行計画のどこを見ればいいの?

ペンギン先生 ペンギン先生

MySQLなら「type」列が最重要。ALLはフルテーブルスキャン(全行走査)で最も遅い。refやeq_refならインデックスが使われていてOK。constは主キー検索で最速。次に「rows」列で推定走査行数を確認。数百万行走査していたら要改善だね。

ひよこ ひよこ

PostgreSQLだと表示が全然違うの?

ペンギン先生 ペンギン先生

PostgreSQLのEXPLAINはツリー形式で表示される。「Seq Scan」がフルスキャン、「Index Scan」がインデックス利用。「cost=0.00..100.00」は処理コストの見積もり、「rows=1000」は推定行数。「EXPLAIN ANALYZE」で実測時間も出るから、見積もりと実測の差も確認できるよ。

ひよこ ひよこ

EXPLAIN見てもよくわからないんだけど…

ペンギン先生 ペンギン先生

最初はそうだよね。まずは「ALLやSeq Scanが出ていないか」「rowsが想定より大きくないか」の2点だけチェックすれば十分。慣れてきたら「Extra列のUsing filesortやUsing temporary」「Nested Loopの内側の行数」なども見ていく。実はEXPLAINの推定値と実測値がズレることがよくあって、統計情報(テーブルのデータ分布の情報)が古いと実行計画自体が間違った判断をする。ANALYZE TABLEで統計を更新すると実行計画が変わって速くなることもある。実行計画を「信じすぎない」ことも大事なポイントなんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
EXPLAINって出てきたら「SQLの前に付けて実行計画を見るコマンド、クエリ最適化の第一歩」と思えばだいたいOK!
📖 おまけ:英語の意味
「EXPLAIN」 = 説明する
💬 「このクエリをどう実行するか説明して」とデータベースに尋ねるイメージ
← 用語集にもどる