视图解决什么问题
视图把常用查询固化成命名对象:简化访问、收敛权限、统一口径。普通视图只保存查询定义,每次访问都要执行底层语句;PostgreSQL 另有物化视图,可以把结果落盘并手动刷新。MySQL 没有原生物化视图。
基本信息
| 普通视图 | 只保存定义,每次访问都执行底层语句 |
|---|---|
| 物化视图 | PostgreSQL 支持,结果落盘并需要 REFRESH |
| MySQL | 无原生物化视图 |
| 权限 | 可以只授权视图而不暴露基表 |
| 创建语法 | CREATE OR REPLACE VIEW,便于重复部署 |
典型使用场景
- 把常用查询固化成视图,统一报表口径
- 只给业务方开放视图权限,不暴露基表
- 把多表连接逻辑收敛到一个地方维护
- 给 BI 工具提供稳定的逻辑表
- 用物化视图缓存重口径的汇总结果
MySQL 写法
MySQL 写法
CREATE OR REPLACE VIEW v_paid_orders AS
SELECT id, user_id, total, created_at
FROM orders
WHERE status = 'paid';
-- 视图上继续过滤,条件下推到基表
SELECT * FROM v_paid_orders WHERE user_id = 100;PostgreSQL 写法
PostgreSQL 写法
CREATE OR REPLACE VIEW v_paid_orders AS
SELECT id, user_id, total, created_at
FROM orders
WHERE status = 'paid';
-- 物化视图:结果落盘,需要手动刷新
CREATE MATERIALIZED VIEW mv_daily_sales AS
SELECT date_trunc('day', created_at) AS d, SUM(total) AS amount
FROM orders GROUP BY 1;
REFRESH MATERIALIZED VIEW mv_daily_sales;几类对象对照
| 对象 | 是否存数据 | 刷新方式 |
|---|---|---|
| 普通视图 | 否,只存定义 | 无需刷新 |
| 物化视图 | 是,结果落盘 | REFRESH MATERIALIZED VIEW |
| 临时表 | 是,会话级 | 会话结束或显式删除 |
| 基表 | 是 | 随写入实时变化 |
视图不天然加速:普通视图每次访问都要执行底层查询,性能仍取决于下层表与索引,语句里少写逻辑不等于更快。
物化视图忘记刷新:数据停留在上一次刷新的时刻,报表口径与实时数据偏差很大,需要调度任务配合并在页面上标注数据时间。
视图里对列做了函数运算时,需要为表达式建对应索引才能加速,普通列索引帮不上忙,语句看着简单但执行计划可能很重。
给视图加过滤条件时优化器通常能下推到基表,但视图里含聚合或 DISTINCT 时下推会被挡住,性能要按实际计划评估。