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


MySQL 9.0 參考手冊  /  ...  /  檢視處理演算法

27.6.2 檢視處理演算法

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

  • 對於 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 DISTINCTLIMIT。有關詳細資訊,請參閱第 10.2.2.4 節,「使用合併或具體化來最佳化衍生表格、檢視參照和通用表格運算式」