文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手冊頁 (TGZ) - 258.2Kb
手冊頁 (Zip) - 365.3Kb
資訊 (Gzip) - 4.0Mb
資訊 (Zip) - 4.0Mb


10.2.2.5 衍生條件下推最佳化

MySQL 支援適用子查詢的衍生條件下推。對於諸如 SELECT * FROM (SELECT i, j FROM t1) AS dt WHERE i > 常數 的查詢,在許多情況下,可以將外部 WHERE 條件下推至衍生資料表,在這種情況下,結果為 SELECT * FROM (SELECT i, j FROM t1 WHERE i > 常數) AS dt。當衍生資料表無法合併到外部查詢中時(例如,如果衍生資料表使用彙總),將外部 WHERE 條件下推至衍生資料表應減少需要處理的列數,進而加快查詢的執行速度。

在下列情況下,外部 WHERE 條件可以下推至實體化的衍生資料表

  • 當衍生資料表不使用彙總或視窗函式時,外部 WHERE 條件可以直接下推至該資料表。這包括具有以 ANDOR 或兩者聯結的多個述詞的 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 清單包含任何對使用者變數的賦值,則無法下推條件。