视图到底还有没有必要用这是一个在团队里能吵起来的问题。一方说视图就是上个时代的产物ORM 都直接操作表了谁还写视图另一方说没有视图你的安全和维护全是裸奔。两边都有道理。但真相是——视图不是该不该用的问题是你在哪个场景用的问题。先说视图存在的理由视图本质上不是表是一段保存下来的 SQL 逻辑。它解决的从来不是性能问题而是三个工程问题1. 安全隔离这是视图最被低估的价值。用户表有 50 个字段你只想让运营看到name、status、created_at。你可以写权限控制但最简单的方式是——建一个只包含这三列的视图把表的权限收掉。不是所有团队都有成熟的 RBAC但几乎所有数据库都支持视图权限。2. 屏蔽表结构变化业务迭代时order表可能从 12 列变成 20 列字段名改了关联关系变了。如果 30 个服务都直接查order表你改一次结构下线 30 个服务。如果它们查的是v_order_detail视图你只需要改视图定义下游无感知。这不是懒这是工程上的接口稳定。3. 封装复杂逻辑一个近30天活跃用户的定义可能涉及 4 张表 JOIN、时间窗口计算、状态过滤。把它写成视图所有人查v_active_users_30d就行。改定义只改一处不用在代码里到处搜。再说视图被抛弃的理由这些理由同样成立而且越来越有说服力1. 性能陷阱这是视图最大的坑。很多数据库对视图的处理是每次查询都重新执行视图里的 SQL而不是把结果物化。尤其是多层嵌套视图视图套视图优化器直接放弃治疗执行计划一塌糊涂。你以为你在简化查询实际上你在制造一个优化器看不懂的黑盒。2. 调试成本线上出了问题日志显示查询的是v_order_summary。然后你要先找到这个视图的定义再展开它的 SQL再去分析为什么慢。如果这个视图还套了另一个视图——恭喜你开始俄罗斯套娃。直接查表至少问题定位是线性的。3. ORM 时代的尴尬MyBatis、JPA、Prisma……现代 ORM 都是直接映射表。你建了视图ORM 不认识要么单独写 SQL要么额外配置。结果就是表用 ORM视图用手写 SQL一套系统两套开发模式维护成本反而上升。那到底什么场景该用给一个我认为靠谱的判断框架场景建议原因权限隔离隐藏列/行✅ 强烈推荐这是视图最不可替代的场景兼容旧接口表结构变了但对外不能变✅ 推荐成本最低的抽象方式固定的复杂报表查询✅ 推荐尤其是多表 JOIN 的统计类查询简单的单表投影只取几列❌ 没必要一个 SELECT 就能解决别过度封装高频核心业务查询⚠️ 慎用优先看执行计划视图可能拖性能嵌套超过两层的视图❌ 别用优化器会惩罚你一句话原则视图应该用来解决多个消费者需要同一份逻辑的问题而不是用来让单个查询看起来简洁。最后说句实话视图不会死但它的角色在变。在 DBA 主导的时代视图是核心资产。在 ORM 主导的时代视图变成了补充工具。它不是银弹也不是废物。该用的时候不用是技术债。不该用的时候硬用也是技术债。区别只在于你有没有想清楚自己在解决什么问题。