EXPLAINは、オプティマイザが選んだ計画、すなわち各テーブルにどうアクセスするかを、クエリを実行せずに示します。インデックスが使われ、調べる行数が少ないことを確認するために読みます。
const / eq_ref / ref(インデックス検索、良い)→ range → index(フルインデックススキャン)→ ALL(full table scan、危険信号)。NULL = なし)。Using index(covering、良い)、Using filesort / Using temporary(メモリまたはディスク上でのソート/グループ化。多くの場合最適化可能)。EXPLAIN SELECT * FROM orders WHERE customer_id = 42 ORDER BY created_at;
-- +------+------+------+---------+--------+----------------+
-- | type | key | rows | Extra |
-- | ALL | NULL | 900k | Using where; Using filesort | <- scans everything, sorts
-- +------+------+------+---------+--------+----------------+
-- Add an index that covers the filter AND the sort order:
CREATE INDEX idx_cust_created ON orders (customer_id, created_at);
EXPLAIN SELECT * FROM orders WHERE customer_id = 42 ORDER BY created_at;
-- | type | key | rows | Extra |
-- | ref | idx_cust_created | 30 | Using where | <- seeks 30 rows, no filesort
このインデックスは90万行のALLスキャンを30行のrefシークに変え、created_atが2番目の列であるため行はあらかじめソートされて出てきます。filesortが消えます。
EXPLAIN ANALYZE(MySQL 8)を使うと、実際の時間と行数も確認でき、見積もりが誤っているケースを捉えられます。
EXPLAINは、当て推量を証拠に置き換える手段です。type: ALL、巨大なrows、Using filesortを見つけることで、どこにインデックスが欠けているかが正確に分かります。「ページが遅い」から的を絞った修正への最短経路です。
ジュニアからシニアまで、詳細な回答付きのIT面接質問ライブラリ。
寄付する