CREATE VIEW
或 ALTER VIEW
的可選 ALGORITHM
子句是 MySQL 對標準 SQL 的擴充。它會影響 MySQL 處理視圖的方式。ALGORITHM
採用三個值:MERGE
、TEMPTABLE
或 UNDEFINED
。
對於
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 DISTINCT
或 LIMIT
。如需詳細資訊,請參閱第 10.2.2.4 節,「使用合併或實體化最佳化衍生表格、視圖參考和通用表格表達式」。