视图就是为我们的语句创建一个【名称】
例如我们查询一个表:select 字段1,字段2,字段3 from table where id=4
1 2 3 4 5 |
select name from user where id < 4; create view user_view as select name from user where id < 4; select * from user_view; |
如果我们创建一个视图取名shop:create view shop as select 字段1,字段2,字段3 from table where id<4
以后直接使用视图即可: select * from shop 主要用来简化sql语句
视图对性能有影响吗?不能提升性能,在分布式和大数据方面表现并不好,反而会降低性能。
只是简化sql语句(微软sqlserver会好一些)。
还有一个安全的优势,因为别人看不到具体sql语句内容。
还有就是比如你的table表有变化,你的查询也发生了改变,但是你的php程序不需要调整,只更改视图的语句即可。
视图会用到索引吗?视图在分布式和大数据方面表现并不好,反而会降低性能。
视图适合怎样的场景呢?
使用项目:OA和ERP中使用。电商项目不建议使用
使用视图方式如何给user表添加数据
//INSERT INTO 视图名称(字段名字) VALUES(‘内容’);
INSERT INTO user_view(name) VALUES(‘shitu’);
1 2 |
create view user_view3 as select name,num from user where num < 4; select * FROM user_view3; |
INSERT INTO user_view(name,num) VALUES(‘shitu2′,5);
但是我们明明写了where num < 4 ; 为啥还能添加
我需要在创建视图with check option;
1 |
create view user_view3 as select name,num from user where num < 4 with check option; |
我们再去执行insert,你就会发现不能添加了
1 2 3 |
INSERT INTO user_view3(name,num) VALUES('shitu2',5) > 1369 - CHECK OPTION failed 'ceshidata.user_view3' > Time: 0s |
什么时候,不能新增和修改呢?
- 有聚合函数
- 包含子查询
- join
物化视图(临时表,真正的表),在mysql其实不存在,但是在其他两大数据库存在orcale sqlserver
主要应用场景:聚合查询、
如果我们数据量有几千万,select count(*) from table_name; 执行15秒
可以使用查询缓存优化,但是命中sql,更新不是这么快
就需要用到
辅助索引:建筑字段索引
物化视图:触发器、存储过程、变量
创建一个实体表,物化视图表(真实的表)只是保存表的数量
记录:查询的结果
然后直接查询物化视图表 ====》获取聚合结果集合
但是不能实时怎么办
就需要用到触发器,修改物化视图表