关于视图的思考:对服务器性能不一定好

问题:

有两个表如下:
表A:语文表
  id:学号(主键)
  yuwen:成绩

表B:数学表
  id:学号(主键)
  shuxue:成绩


如果我要查一个人的语文和数学成绩,有两种方法:

一:分两次查,每次根据id来,有索引;
  select yuwen from A where id=123;
  select shuxue from B where id=123;

二:建一个视图,联表查询,有id、yuwen、shuxue三个字段,
  select yuwen,shuxue from A,B where A.id = B.id and A.id=123;

如果数据量很大, 那么哪个效率高啊?

分析

这个问题关键是看:联表查询的视图,有索引吗?
说法一:where A.id = B.id 是没有索引的,但是where A.id = B.id and A.id=123 是有索引的。如果是这样的话,不但用到了索引,而且减少了查询次数,那么效率肯定是高的
说法二:联表查询没有用到索引,会导致一张表进行全表扫描,所以效率会低

怎么觉得都有道理呢。。。。

再来看网上的一个说法,视图的优缺点

优点:
  简单性
  安全性
  逻辑数据独立性

缺点:
  性能:SQL Server必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,SQL Server也把它变成一个复杂的结合体,需要花费一定的时间。
  修改限制

老大说:

  涉及到具体数据库如何生成执行计划了
  视图当然是有代价的,代价往往就是性能和可维护性嘛
  数据库本身又不能有什么缓存机制
  视图肯定不是为性能设计的

所以我觉得:视图从来就没有性能上的优点,它只是方便而已

 在代码模型层中建视图好还是在数据库中建视图好?

  比较一下就知道了
  在model层做视图开发人员可以直观的了解视图,并可以根据需求随时修改
  在数据库做视图则简化了业务逻辑,但是视图的维护需要花费额外的人力
  其实就像是model有afterSave beforeSave之类的钩子,数据库也有触发器,哪个好?差不多,前者一样是透明,好维护,后者则简化逻辑,同时效率更高。
  此外要考虑你使用的数据库,oracle,sqlserver等数据库的视图数据是缓存的,从视图查询比使用表连接查询要快的多,但是mysql的视图数据是非缓存的,并没有性能的提升。

参考链接:

[1].https://blog.csdn.net/onebigday/article/details/50541787
[2].https://www.cnblogs.com/liuguanghai/p/5460913.html
[3].https://segmentfault.com/q/1010000004613776

原文地址:https://www.cnblogs.com/acm-bingzi/p/sqlView.html