MySQL 支援適用子查詢的衍生條件下推。對於諸如 SELECT * FROM (SELECT i, j FROM t1) AS dt WHERE i >
的查詢,在許多情況下,可以將外部 常數
WHERE
條件下推至衍生資料表,在這種情況下,結果為 SELECT * FROM (SELECT i, j FROM t1 WHERE i >
。當衍生資料表無法合併到外部查詢中時(例如,如果衍生資料表使用彙總),將外部 常數
) AS dtWHERE
條件下推至衍生資料表應減少需要處理的列數,進而加快查詢的執行速度。
在下列情況下,外部 WHERE
條件可以下推至實體化的衍生資料表
當衍生資料表不使用彙總或視窗函式時,外部
WHERE
條件可以直接下推至該資料表。這包括具有以AND
、OR
或兩者聯結的多個述詞的WHERE
條件。例如,查詢
SELECT * FROM (SELECT f1, f2 FROM t1) AS dt WHERE f1 < 3 AND f2 > 11
會重寫為SELECT f1, f2 FROM (SELECT f1, f2 FROM t1 WHERE f1 < 3 AND f2 > 11) AS dt
。當衍生資料表具有
GROUP BY
且不使用任何視窗函式時,參考一個或多個不屬於GROUP BY
的欄的外部WHERE
條件可以作為HAVING
條件下推至衍生資料表。例如,
SELECT * FROM (SELECT i, j, SUM(k) AS sum FROM t1 GROUP BY i, j) AS dt WHERE sum > 100
在衍生條件下推之後,會重寫為SELECT * FROM (SELECT i, j, SUM(k) AS sum FROM t1 GROUP BY i, j HAVING sum > 100) AS dt
。當衍生資料表使用
GROUP BY
且外部WHERE
條件中的欄是GROUP BY
欄時,參考這些欄的WHERE
條件可以直接下推至衍生資料表。例如,查詢
SELECT * FROM (SELECT i,j, SUM(k) AS sum FROM t1 GROUP BY i,j) AS dt WHERE i > 10
會重寫為SELECT * FROM (SELECT i,j, SUM(k) AS sum FROM t1 WHERE i > 10 GROUP BY i,j) AS dt
。如果外部
WHERE
條件中有述詞參照了屬於GROUP BY
的欄位,以及參照了不屬於GROUP BY
的欄位,前者類型的述詞會被下推為WHERE
條件,後者類型的述詞則會被下推為HAVING
條件。例如,在查詢SELECT * FROM (SELECT i, j, SUM(k) AS sum FROM t1 GROUP BY i,j) AS dt WHERE i > 10 AND sum > 100
中,外部WHERE
子句中的述詞i > 10
參照了GROUP BY
欄位,而述詞sum > 100
則未參照任何GROUP BY
欄位。因此,衍生表格下推最佳化會導致查詢以類似於此處所示的方式進行重寫SELECT * FROM ( SELECT i, j, SUM(k) AS sum FROM t1 WHERE i > 10 GROUP BY i, j HAVING sum > 100 ) AS dt;
若要啟用衍生條件下推,則必須將 optimizer_switch
系統變數的 derived_condition_pushdown
旗標(在此版本中新增)設定為 on
,這是預設設定。如果此最佳化被 optimizer_switch
停用,您可以使用 DERIVED_CONDITION_PUSHDOWN
最佳化提示來為特定查詢啟用它。若要針對給定的查詢停用最佳化,請使用 NO_DERIVED_CONDITION_PUSHDOWN
最佳化提示。
下列限制適用於衍生表格條件下推最佳化
衍生表格條件下推最佳化可以與
UNION
查詢一起使用,但有下列例外如果
UNION
的任何具體化衍生表格是遞迴通用表格運算式(請參閱 遞迴通用表格運算式),則無法將條件下推用於UNION
查詢。包含非決定性運算式的條件無法下推至衍生表格。
衍生表格無法使用
LIMIT
子句。包含子查詢的條件無法下推。
如果衍生表格是外部聯結的內部表格,則無法使用最佳化。
如果具體化衍生表格是通用表格運算式,則如果它被多次參照,條件不會被下推到它。
如果條件的形式為
,則可以使用參數下推條件。如果外部derived_column
> ?WHERE
條件中的衍生欄位是在基礎衍生表格中具有?
的運算式,則無法下推此條件。對於查詢中條件是針對使用
ALGORITHM=TEMPTABLE
建立的檢視表的表格,而不是針對檢視表本身的情況,在解析時不會識別多重相等性,因此無法下推條件。這是因為在最佳化查詢時,條件下推發生在解析階段,而多重相等性傳播發生在最佳化階段。對於使用
ALGORITHM=MERGE
的檢視表來說,這不是問題,因為可以傳播相等性並下推條件。如果衍生表格的
SELECT
清單包含任何對使用者變數的賦值,則無法下推條件。