首页/数据/SQL 速查/CREATE VIEW 基础与物化视图
变更与事务52 条

CREATE VIEW 基础与物化视图

把常用查询固化为视图:简化访问与权限控制;注意普通视图不存数据,PG 需要物化视图才可落盘加速。

SQL 速查数据更新于 2026-10-13

视图解决什么问题

视图把常用查询固化成命名对象:简化访问、收敛权限、统一口径。普通视图只保存查询定义,每次访问都要执行底层语句;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 时下推会被挡住,性能要按实际计划评估。

易错点

  • 指望视图天然加速:普通视图不存数据,性能仍取决于底层查询与索引
  • 物化视图忘记刷新:数据停留在上次刷新时刻,需要调度配合
  • 视图嵌套层数太深:外层过滤条件难以有效下推,排查问题也更难追到基表
  • 基表结构变更后视图失效:改名或删列会让视图报错,需要同步重建
  • 只授权视图却不校验定义:视图里若包含敏感列,权限收敛的目标就落空了

数据来源与参考

  • MySQL 8.0 Reference Manual · CREATE VIEW Statement
  • PostgreSQL Documentation · CREATE MATERIALIZED VIEW
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌