关于视图的思考:对服务器性能不一定好
问题:
有两个表如下:
表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