使用子查詢加入(派生表)
SELECT x, ...
FROM ( SELECT y, ... FROM ... ) AS a
JOIN tbl ON tbl.x = a.y
WHERE ...
這會將子查詢評估為臨時表,然後將 JOIN
評估為 tbl
。
在 5.6 之前,臨時表上沒有索引。所以,這可能非常低效:
SELECT ...
FROM ( SELECT y, ... FROM ... ) AS a
JOIN ( SELECT x, ... FROM ... ) AS b ON b.x = a.y
WHERE ...
使用 5.6,優化器可以計算出最佳索引並在執行中建立它。 (這有一些開銷,所以它仍然不是’完美’。)
另一個常見的範例是有一個子查詢來初始化一些東西:
SELECT
@n := @n + 1,
...
FROM ( SELECT @n := 0 ) AS initialize
JOIN the_real_table
ORDER BY ...
(注意:這在技術上是一個 CROSS JOIN
(笛卡爾積),如缺少 ON
所示。但它很有效,因為子查詢只返回一行必須與 the_real_table
中的 n 行匹配。)