PolarDB MySQL版支援條件下推(WHERE to Derived Tables)功能。對於滿足前提條件的複雜查詢,您可以通過該功能對SQL查詢進行變換。即當派生表(Derived Tables)不能合并到外部查詢時,將外部WHERE條件下推到派生表(Derived Tables)中減少SQL需要處理的行數,從而提升SQL查詢的效能。
前提條件
叢集版本適用的資料庫引擎版本如下,如何查看叢集版本,請參見查詢版本號碼。
MySQL 8.0.1,且小版本需為8.0.1.1.42及以上版本。
MySQL 8.0.2,且小版本需為8.0.2.2.10及以上版本。
使用限制
如果條件運算式中的所有列(或對應的等價列)都來自物化的派生表(Derived Tables),則該條件可以下推至物化表。
如果物化派生表(Derived Tables)有Limit限制,則禁止下推。
外層WHERE條件運算式的列或者映射到物化表對應的列,存在以下情況則不支援下推:
該列引用了子查詢或者是非確定性(相同的輸入條件下,可能會產生不同的結果);
該列是預存程序或者儲存函數。
背景資訊
基於使用者複雜的查詢情境,資料庫需要更強大的下推能力來加速使用者查詢。PolarDB MySQL版基於社區版MySQL原有的條件下推功能進行了功能增強,實現了更加完善和強大的下推能力,主要包括以下方面:
添加了等值條件的傳遞 ;
在派生表(Derived Tables)是union的情境下,支援將符合的條件下推到union對應的部分;
與條件下推(HAVING to WHERE)配合使用,可將下推後的條件基於等價關係進一步級聯下推。
使用方法
您可以通過設定loose_derived_cond_pushdown_mode參數值來開啟從WHERE條件到派生表(Derived Tables)的條件下推功能。具體操作請參見設定叢集參數和節點參數。
您也可以在Session層級的資料庫連接中通過以下兩條命令開啟從WHERE條件到派生表(Derived Tables)的條件下推功能。
SET optimizer_switch="derived_condition_pushdown=on";
SET derived_cond_pushdown_mode=on;
參數說明
參數名稱 | 層級 | 描述 |
loose_derived_cond_pushdown_mode | Global | 從WHERE條件到派生表(Derived Tables)的條件下推功能控制開關。取值範圍:
|
樣本
將條件從WHERE子句下推至派生表(Derived Tables)中。
樣本1:
SELECT *
FROM t1, (
SELECT x
FROM t2
GROUP BY x
) d_tab, t2
WHERE t1.a = d_tab.x
AND t1.a > 6;
條件下推變換後結果為:
SELECT *
FROM t1, (
SELECT x
FROM t2
WHERE x > 6
GROUP BY x
) d_tab
WHERE t1.a = d_tab.x
AND t1.a > 6;
樣本2:
SELECT f1
FROM (
SELECT (
SELECT f1
FROM t1
LIMIT 1
) AS f1
FROM t1
UNION
SELECT f2
FROM t2
) dt
WHERE f1 = 1;
條件下推變換後結果為:
SELECT f1
FROM (
SELECT (
SELECT f1
FROM t1
LIMIT 1
) AS f1
FROM t1
UNION
SELECT f2
FROM t2
WHERE f2 = 1
) dt
WHERE f1 = 1;
樣本3:
SELECT *
FROM (
SELECT f1, f2
FROM t1
) dt
GROUP BY f1
HAVING f1 < 3
AND f2 > 11
AND MAX(f3) > 12;
條件下推變換後結果為:
SELECT *
FROM (
SELECT f1, f2
FROM t1
WHERE f1 < 3
) dt
WHERE f1 < 3
GROUP BY f1
HAVING f2 > 11
AND MAX(f3) > 12;