標準的 EXPLAIN 已能顯示查詢執行計畫,但 EXPLAIN EXTENDED 更進一步——它能揭示 MySQL 查詢優化器內部如何重寫你的 SQL。配合 SHOW WARNINGS,我們能看到優化後的實際查詢語句,這對於深度 SQL 調優至關重要。
EXPLAIN EXTENDED SELECT * FROM account\G;
SHOW WARNINGS\G;
-- 原始查詢
EXPLAIN EXTENDED SELECT * FROM account\G;
-- SHOW WARNINGS 輸出
Message: select `dbunit`.`account`.`id` AS `id`,`dbunit`.`account`.`name` AS `name` from `dbunit`.`account`
優化器將 SELECT * 明確化為具體欄位,這在生產環境中建議開發者直接寫明欄位,減少網路傳輸與解析開銷。
EXPLAIN EXTENDED SELECT * FROM sbtest WHERE id>5 AND id>6 AND c="a" AND pad=c
優化器無法將 id>5 AND id>6 合併為 id>6,這揭示了優化器在條件推導上的邊界。
EXPLAIN EXTENDED SELECT * FROM t WHERE a IN (SELECT b FROM i);
SHOW WARNINGS\G;
-- 輸出片段
Message: select `test`.`t`.`a` AS `a`... from `test`.`t` where
<in_optimizer>(`test`.`t`.`a`, <exists>(select 1 AS `Not_used` from `test`.`i` where (<cache>(`test`.`t`.`a`) = `test`.`i`.`b`)))
看似不相關的子查詢被標記為 DEPENDENT SUBQUERY,優化器實際將其轉換為 EXISTS 相關子查詢並引入快取機制,這解釋了為什麼看似獨立的子查詢會產生相關性。
EXPLAIN EXTENDED SELECT t1.id,t2.pad FROM sbtest t1, sbtest t2 WHERE t1.id=5 AND t2.k=t1.k;
SHOW WARNINGS\G;
-- 輸出
Message: SELECT `test`.`t1`.`id` AS `id`,`test`.`t2`.`pad` AS `pad` FROM `test`.`sbtest` `t1` JOIN `test`.`sbtest` `t2` WHERE ((`test`.`t2`.`k` = `test`.`t1`.`k`) AND (`test`.`t1`.`id` = 5))
EXPLAIN 顯示 t1 使用 const 類型(主鍵查找),但優化後的 SQL 中並未明確體現這一優化細節,說明 SHOW WARNINGS 輸出的優化 SQL 可能不是最終執行計畫的完整反映。
EXPLAIN 觀察執行計畫關鍵指標EXPLAIN EXTENDED + SHOW WARNINGS 理解優化器重寫邏輯掌握 EXPLAIN EXTENDED,就像擁有了窺探優化器「大腦」的 X 光眼,是資深 DBA 與後端工程師進行深度 SQL 調優的必備技能。