MySQL 4.1 引入派生表(即 FROM 子句中的子查詢),5.0 再添視圖。兩者看似相近,實際執行路徑卻天差地別。
| 特性 | 派生表 | 視圖 |
|---|---|---|
| 執行策略 | 強制物化到無索引臨時表 | 優先查詢重寫/合併,僅在無法合併或強制指定時物化 |
| 索引支持 | 臨時表無索引,連接性能極差 | 可利用底表索引 |
| EXPLAIN 影響 | 執行 EXPLAIN 也會觸發物化,錯誤 SQL 可能導致 EXPLAIN 執行極久 | 僅解析重寫邏輯,極快 |
-- 基表查詢(有索引):0.03 秒
SELECT * FROM test WHERE i=5;
-- 派生表查詢:1 分 40 秒!全表掃描臨時表
SELECT * FROM (SELECT * FROM test) t WHERE i=5;
-- 視圖查詢:0.10 秒,索引生效
CREATE VIEW v AS SELECT * FROM test;
SELECT * FROM v WHERE i=5;
EXPLAIN 驚人對比:
type=const,走主鍵,rows=1type=ALL,掃描 163 萬行臨時表,EXPLAIN 本身耗時 54 秒CREATE VIEW,查詢後 DROP VIEW,兼顧代碼結構與性能。同語義查詢因語法形式不同導致數量級性能差異,屬於優化器邏輯缺陷,期待後續版本統一處理路徑(如 5.6+ 引入的 derived_merge 優化已部分緩解)。