視圖是虛擬表,不儲存實際資料,僅保存 SELECT 定義。查詢視圖時,MySQL 將定義展開並執行。基礎表資料變動,視圖即時反映。
ALTER VIEW,無須修改所有應用 SQL。| 演算法 | 行為 | 適用場景 |
|---|---|---|
| MERGE | 將視圖定義合併到外部查詢,直接操作基礎表 | 簡單視圖、需可更新視圖 |
| TEMPTABLE | 先將視圖結果寫入暫存表,再查詢暫存表 | 含聚合、DISTINCT、LIMIT 等無法合併的視圖 |
| UNDEFINED(預設) | MySQL 自動選擇,優先 MERGE | 大多數情況 |
CREATE [OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION];
USE test;
CREATE ALGORITHM = MERGE VIEW aaa AS SELECT * FROM user;
檢視 .frm 檔案可見:
TYPE=VIEW
query=select `test`.`user`.`id` AS `id`, ...
updatable=1
algorithm=2 -- 2=MERGE
視圖無 .MYD/.MYI 檔案,確認資料仍在基礎表。
ALTER ALGORITHM = MERGE VIEW aaa
AS SELECT * FROM user WHERE id <> ANY (SELECT u_id FROM comment);
-- 查看資料
SELECT * FROM aaa;
-- 查看定義
SHOW CREATE VIEW aaa\G
-- 刪除
DROP VIEW aaa;
視圖可更新需滿足:
id+1)。v_<業務域>_<用途>,如 v_order_summary。GRANT SELECT ON v_* TO dev_role;,基礎表僅授權 DBA。ALGORITHM=TEMPTABLE 避免臨時表爆炸。COMMENT 記錄業務用途、基礎表、維護人。