用於 CREATE VIEW
或 ALTER VIEW
的可選 ALGORITHM
子句是 MySQL 對標準 SQL 的擴展。 它會影響 MySQL 處理檢視的方式。ALGORITHM
採用三個值:MERGE
、TEMPTABLE
或 UNDEFINED
。
對於
MERGE
,引用檢視的陳述式文字和檢視定義會合併,使得檢視定義的部分取代陳述式的對應部分。對於
TEMPTABLE
,檢視的結果會擷取到暫時表格中,然後用來執行陳述式。對於
UNDEFINED
,MySQL 會選擇要使用的演算法。如果可能,它會優先選擇MERGE
而不是TEMPTABLE
,因為MERGE
通常更有效率,而且如果使用暫時表格,檢視將無法更新。如果沒有
ALGORITHM
子句,則預設演算法由derived_merge
旗標的值決定,該旗標是optimizer_switch
系統變數。 有關其他討論,請參閱第 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 節,「使用合併或具體化來最佳化衍生表格、檢視參照和通用表格運算式」。