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;

两种算法如下所示:


MySQL视图_第1张图片

因为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

你可能感兴趣的:(视图)