物化视图加速的是什么
固定维度的聚合查询每次都去扫明细,代价高且重复。物化视图把聚合结果预先算好并随导入增量刷新,查询命中后由优化器自动改写为读视图。它加速的是「重复出现的同一类聚合」,不是所有查询;建得越多,导入链路的维护成本越高。
基本信息
| 刷新方式 | 导入触发或定时刷新 |
|---|---|
| 查询改写 | 命中后自动匹配,无需改 SQL |
| 适用形态 | 固定维度的聚合,如按门店按天汇总 |
| 观测指标 | 命中率与刷新延迟 |
| 代价 | 每个视图都要随导入维护,拖慢导入 |
典型使用场景
- 看板固定聚合:门店按天、类目按天的汇总反复被查询
- 明细表很宽:把常用几列聚合出来,扫描量大幅下降
- 高并发点查:聚合结果体量小,支撑并发能力更强
- 多下游复用:一个视图同时服务报表与接口
- 降本:用预聚合结果替代对明细的反复全表扫描
创建与查看
创建与查看
-- 同步物化视图:按门店与日期预聚合
CREATE MATERIALIZED VIEW mv_store_day
AS
SELECT store_id, date(create_time) AS dt, sum(pay_amt) AS pay_amt
FROM dw.dwd_trade_order
GROUP BY store_id, date(create_time);
SHOW MATERIALIZED VIEWS FROM dw; -- 查看视图清单与状态
-- 查询原表时由优化器判断是否改写为读视图视图类型与能力
| 类型 | 刷新方式 | 适用判断 |
|---|---|---|
| 同步物化视图 | 随导入同步维护 | 单表聚合,维度固定 |
| 异步物化视图 | 按需构建与刷新 | 多表关联与复杂聚合 |
| 普通视图 | 不存数据 | 只做逻辑封装 |
| 预聚合表(手写) | 由调度任务产出 | 逻辑复杂、需要精细控制 |
命中率才是收益指标
建完视图不等于查询就会变快:只有写法和维度能对上,优化器才会改写。上线后应当观察视图的命中次数与刷新延迟,长期没人命中的视图要考虑下线。判断依据是实际查询日志,而不是当初的设想。
异步物化视图的构建与刷新配置随版本演进较多,语句细节以所用版本的官方文档为准;建之前先确认版本支持的语法,再定刷新策略。
物化视图数量失控会明显拖慢导入链路:每次导入都要同步维护所有相关视图,导入耗时翻倍,而多数视图其实并没有被查询命中。