Oracle 物化視圖支持 ON COMMIT FAST REFRESH,數據實時增量維護。MySQL 無原生物化視圖,但可用 **觸發器 + 聚合表** 實現同等效果。
場景:訂單表 Orders → 產品維度聚合表 Order_mv(價格求和、數量求和、平均價、訂單數)。
0 THEN SET @new_price_avg = @new_price_sum / @new_order_cnt; REPLACE INTO Order_mv VALUES (OLD.product_name, @new_price_sum, @new_amount_sum, @new_price_avg, @new_order_cnt); ELSE -- 最後一筆刪除,移除聚合行 DELETE FROM Order_mv WHERE product_name = OLD.product_name; END IF; END$$ DELIMITER ;
原文中 DELETE FROM Order_mv WHERE product_name = @old.name 變量名錯誤,應為 OLD.product_name。
| 維度 | 觸發器方案 | 定時全量重建 |
|---|---|---|
| 實時性 | 毫秒級 | 分鐘/小時級 |
| 寫入開銷 | 每 DML 額外 1-2 次聚合表讀寫 | 無寫入開銷 |
| 一致性 | 事務內強一致 | 最終一致 |
| 適用場景 | 聚合維度固定、寫入量中等、需實時 | 維度變動大、寫入極高、可容忍延遲 |
REPLACE INTO 或 INSERT ... ON DUPLICATE KEY UPDATE 保冪等IFNULL() 防御首次插入時聚合表無記錄BEFORE 讀取舊值,避免死鎖NEW./OLD. 與用戶變量 @varOrders 聚合與 Order_mv 差異,發現偏差觸發告警三個觸發器約 80 行代碼,即可在 MySQL 實現 Oracle 級的 FAST REFRESH ON COMMIT 物化視圖效果。關鍵在於:**增量計算邏輯正確、變量作用域清晰、邊界條件(歸零刪除)覆蓋完整**。生產環境建議配合定時全量校驗任務,雙重保障數據準確。