您可以在创建物化视图时指定刷新模式或者手动刷新物化视图。
- 权限要求
- 需要物化视图INSERT权限。
- 需要有物化视图所涉及的所有基表相关列(或整个表)的SELECT权限。
- 如果要启用自动刷新功能,需要创建者具备通过服务器本地(即127.0.0.1)或者任意IP(即'%')刷新视图的权限。
- 创建时指定刷新模式
物化视图刷新分为全量刷新(COMPLETE)和增量刷新(FAST)两种刷新模式。如果未指定刷新模式,默认为全量刷新。
每种刷新模式适用于不同的触发方式。
CREATE MATERIALIZED VIEW mv_name [REFRESH [FAST|COMPLETE] [ON <DEMAND|OVERWRITE>] [START WITH date] [NEXT date]]
说明 目前仅支持全量刷新(COMPLETE)。- 手动刷新
REFRESH MATERIALIZED VIEW <mv_name>
全量刷新模式
创建物化视图时默认为全量刷新模式。全量刷新会计算刷新时刻的查询结果,并且用覆盖的方式替换原来的结果。
- 全量刷新触发机制
- ON DEMAND:按需刷新。按需刷新要么用户手动触发刷新,要么自动刷新。全量刷新默认采用按需刷新(ON DEMAND)。
- 手动刷新。示例如下:
CREATE MATERIALIZED VIEW my_mv REFRESH ON DEMAND AS SELECT * FROM base;
- 自动刷新 。5分钟后第一次刷新,此后每分钟1次,示例如下:
CREATE MATERIALIZED VIEW my_mv REFRESH ON DEMAND START WITH now() + interval 5 minute NEXT now() + interval 1 minute AS SELECT * FROM base;
- 手动刷新。示例如下:
自动刷新
自动刷新支持使用时间函数(
START WITH ... NEXT
)来设置刷新规律。START WITH
是可选的,默认从当前时刻开始。示例如下:- 每周一晚上2点刷新。
CREATE MATERIALIZED VIEW myview REFRESH START WITH DATE_FORMAT(now() + interval 7 - weekday(now()) day, '%Y-%m-%d 02:00:00') NEXT DATE_FORMAT(now() + interval 7 - weekday(now()) day, '%Y-%m-%d 02:00:00') AS SELECT count(*) as cnt FROM base;
- 每天凌晨2点刷新。
CREATE MATERIALIZED VIEW myview REFRESH START WITH DATE_FORMAT(now() + interval 1 day, '%Y-%m-%d 02:00:00') NEXT DATE_FORMAT(now() + interval 1 day, '%Y-%m-%d 02:00:00') AS SELECT count(*) as cnt FROM base;
- 每个月第一天的凌晨2点刷新。
CREATE MATERIALIZED VIEW myview REFRESH NEXT DATE_FORMAT(last_day(now()) + interval 1 day, '%Y-%m-%d 02:00:00') AS SELECT count(*) as cnt FROM base;
- 只刷新一次。
CREATE MATERIALIZED VIEW myview REFRESH START WITH now() + interval 1 day AS SELECT count(*) as cnt FROM base;
如果某次刷新所用的时间超过自动刷新指定的时间间隔,会自动跳过超过的时间点,等到下次最近的时间点再刷新。
假设自动刷新设置是在00:05:00, 00:10:00, 00:15:00这3个时间点,间隔5分钟。如果00:05:00时候开始了某次刷新,一直到00:12:00刷新才结束,那么设置的00:10:00刷新会被跳过,直到00:15:00再开始刷新。