MySQL 8.4 參考手冊  /  ...  /  視圖處理演算法

27.5.2 視圖處理演算法

CREATE VIEWALTER VIEW 的可選 ALGORITHM 子句是 MySQL 對標準 SQL 的擴充。它會影響 MySQL 處理視圖的方式。ALGORITHM 採用三個值:MERGETEMPTABLEUNDEFINED

  • 對於 MERGE,引用視圖的陳述式文字和視圖定義會合併,使得視圖定義的部分取代陳述式中對應的部分。

  • 對於 TEMPTABLE,視圖的結果會擷取到暫存表格中,然後用它來執行陳述式。

  • 對於 UNDEFINED,MySQL 會選擇使用哪個演算法。如果可能,它會偏好 MERGE 而非 TEMPTABLE,因為 MERGE 通常更有效率,而且如果使用暫存表格,視圖就無法更新。

  • 如果沒有 ALGORITHM 子句,預設演算法會由 optimizer_switch 系統變數的 derived_merge 旗標值決定。如需更多討論,請參閱第 10.2.2.4 節,「使用合併或實體化最佳化衍生表格、視圖參考和通用表格表達式」

明確指定 TEMPTABLE 的一個原因是,在建立暫存表格之後且在用它完成處理陳述式之前,可以釋放基礎表格上的鎖定。這可能會比 MERGE 演算法更快釋放鎖定,這樣使用視圖的其他用戶端就不會被封鎖那麼久。

視圖演算法可能是 UNDEFINED 的原因有三個

  • CREATE VIEW 陳述式中沒有 ALGORITHM 子句。

  • CREATE VIEW 陳述式具有明確的 ALGORITHM = UNDEFINED 子句。

  • 為只能用暫存表格處理的視圖指定了 ALGORITHM = MERGE。在這種情況下,MySQL 會產生警告並將演算法設定為 UNDEFINED

如前所述,MERGE 是透過將視圖定義的對應部分合併到引用視圖的陳述式中來處理的。以下範例簡要說明 MERGE 演算法的工作方式。這些範例假設存在一個視圖 v_merge,其定義如下

CREATE ALGORITHM = MERGE VIEW v_merge (vc1, vc2) AS
SELECT c1, c2 FROM t WHERE c3 > 100;

範例 1:假設我們發出這個陳述式

SELECT * FROM v_merge;

MySQL 會以下列方式處理該陳述式

  • v_merge 變成 t

  • * 變成 vc1, vc2,對應於 c1, c2

  • 新增視圖 WHERE 子句

要執行的產生成式為

SELECT c1, c2 FROM t WHERE c3 > 100;

範例 2:假設我們發出這個陳述式

SELECT * FROM v_merge WHERE vc1 < 100;

此陳述式的處理方式與上一個類似,不同之處在於 vc1 < 100 變成 c1 < 100,且視圖的 WHERE 子句會使用 AND 連接詞新增至陳述式的 WHERE 子句(並新增括號以確保子句的部分以正確的優先順序執行)。要執行的產生成式為

SELECT c1, c2 FROM t WHERE (c3 > 100) AND (c1 < 100);

實際上,要執行的陳述式具有以下形式的 WHERE 子句

WHERE (select WHERE) AND (view WHERE)

如果無法使用 MERGE 演算法,則必須改用暫存表格。防止合併的結構與防止衍生表格和通用表格表達式中合併的結構相同。例如,子查詢中的 SELECT DISTINCTLIMIT。如需詳細資訊,請參閱第 10.2.2.4 節,「使用合併或實體化最佳化衍生表格、視圖參考和通用表格表達式」