MySQL视图

1 什么是视图
视图是一张虚拟表,本身不存储数据,数据来自于创建视图的表。

2 应用场景
1)使用视图可以屏蔽底层数据库表结构变化给应用带来的冲击。比如项目使用了第三方产品构建,可以创建对第三方产品数据库表的视图,这样如果第三方产品的表结构变化了,只需要重新定义视图就可以了,应用不需要修改。

2)权限控制。可以通过视图来限制访问表的行和列。
限制行:create view v_tbl as select * from tbl where col='1';
限制列:create view v_tbl as select col1,col2 from tbl;

3)使用视图可以屏蔽复杂的业务逻辑。
可以将复杂的数据库表逻辑建成视图,这样应用只需要访问这个视图就可以了。


3 可更新视图
视图可以被插入、更新和删除。
如果视图定义中使用了GROUP BY, UNION,聚合函数等,则视图就不可以被更新了。

另外视图的更新必须符合视图本身的where条件定义,例如:
create view v_tbl as select * from tbl where col=1;
update v_tbl set col=2 ;//这条语句是不能执行的。


4 视图的临时表和合并算法
对于如下视图的查询:
create view v_tbl as select * from tbl where col=1;
select * from v_tbl where col2 = 2;

这个查询场景有2种实现方式:
1.合并
将2个SQL解析后合并,合并为:
select * from tbl where col=1 and col2=2;

2.临时表算法
create temporary table tmp_tbl as select * from tbl where col=1;
select * from tmp_tbl where col2=2;

两种算法如下所示:


[img]http://dl2.iteye.com/upload/attachment/0104/2545/00b598c7-6eea-31f2-8c67-a7d7a28c3f77.jpg[/img]

因为MySQL优化器很难对临时表进行优化,所以MySQL尽可能的会使用合并算法,但是正如可更新视图的限制一样,并不是所有的查询都可以使用合并算法。
如果视图中含有GROUP BY DISTINCT UNION 子查询 聚合函数等等,这些无法在原表和视图记录中建立一一映射的场景中,都无法使用合并算法。

通过explain select * from <view> 如果返回的select_type为DERIVED,则表示是使用临时表算法的,否则select_type的值为SIMPLE。


5 物化视图
物化视图建立时,会根据视图的定义,将数据存储下来,并且如果基表的数据有变动,物化视图中的数据也得随之刷新。
MySQL目前不支持物化视图。
6 视图的限制和问题
1)视图无法创建索引
2)where子句中的条件无法下推,导致性能问题。
例如:
create view v_tbl as select day,sum(cost) as cost from tbl group by day;
select * from v_tbl where day between '2014-12-01' and '2014-12-10';
由于使用了GROUP BY后无法使用合并算法,只能使用临时表算法,这个day的where条件无法下推到临时表中,所以要先将所有范围内的额数据都存放到临时表中,然后再查询,并且临时表也没有索引,所以这样做性能消耗会很大。

7参考资料:
《高性能MySQL》
http://baike.baidu.com/link?url=_T4guZva-ARKfK3UgxE-3zIQWrFQDTe5oeqYhidgN0JvFoPzgTHb6y06GBSY8uo0kW613ktukWdy5r-bwjTzvq
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值