視圖是虛擬表,不儲存實際資料,而是封裝 SELECT 查詢邏輯。善用視圖可簡化複雜查詢、隔離業務邏輯、實現權限控制。本文系統整理視圖的建立、修改、查看、刪除語法,深度解析三種算法模式(MERGE/TEMPTABLE/UNDEFINED)的效能差異與選擇策略。
CREATE
[OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION];
範例:
CREATE ALGORITHM = MERGE VIEW v_user AS SELECT * FROM user;
ALTER
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION];
範例:
ALTER VIEW v_user AS SELECT * FROM user WHERE name='Jacson';
SELECT * FROM v_user;SHOW CREATE VIEW v_user\GDROP VIEW v_user;
| 算法 | 機制 | 效能特徵 | 適用場景 |
|---|---|---|---|
| MERGE | 將視圖定義與外層查詢合併,直接操作基表 | 最優,可使用基表索引,無臨時表開銷 | 簡單視圖、高頻查詢、記憶體受限環境 |
| TEMPTABLE | 先將視圖結果物化到臨時表,再查詢臨時表 | 較差,需寫入/讀取臨時表,大數據量明顯慢 | 含聚合、DISTINCT、GROUP BY、UNION 等無法合併的複雜視圖 |
| UNDEFINED | MySQL 自動選擇(優先 MERGE) | 自適應 | 不確定視圖複雜度時的預設選擇 |
ALGORITHM=MERGE 避免意外降級 TEMPTABLE。GROUP BY、HAVING、DISTINCT、UNION、聚合函數、子查詢 等無法合併構造時,MySQL 會自動轉為 TEMPTABLE。DEFINER(預設,以建立者權限執行)vs INVOKER(以調用者權限執行),配合 DEFINER 實現「最小權限原則」。WHERE 條件的資料,CASCADED(預設,級聯檢查)vs LOCAL(僅檢查當前視圖)。基表結構變更(如刪除欄位)會導致視圖失效。生產環境建議:
1. 部署前執行 CHECK TABLE view_name。
2. 監控 information_schema.VIEWS 的 VIEW_DEFINITION 異常。
3. 遷移腳本中同步更新視圖定義。
視圖是邏輯層封裝利器,掌握算法選擇與權限控制,讓複雜查詢變得簡單可控。