Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1208606
  • 博文数量: 350
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 5668
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-23 17:53
文章分类

全部博文(350)

文章存档

2013年(350)

分类: Mysql/postgreSQL

2013-04-11 15:59:44

1.3 指定视图处理方式

  MySQL数据库的CREATE/ALTER VIEW语句中的ALGORITHM子句是对标准语句所做的扩展。它的功能是确定MySQL如何处理视图。

  一般ALGORITHM有三个值:MERGE、TEMPTABLE或UNDEFINCED,默认值是UNDEFINED(当没有指定ALGORITHM子句时)。

      
  • MERGE:将查询视图的语句与视图的定义语句合并处理。
  •   
  • TEMPTABLE:视图查询的结果保存到临时表,而后在该临时表基础上执行查询视图的语句;
  •   
  • UNDEFINED:由MySQL选择使用哪种算法,一般会首选MERGE,因为MERGE更有效率,而且TEMPTABLE不支持更新。

  这些概念听起来都比较抽象,对于生在新长在红旗下普遍善良单纯无条件依附强权的无数蚁族来说,可能理解起来非常困难,其实用不着太过自卑,你这不是笨,你只是单纯。

  下面结合例子来说明白,希望能够帮助理解。先来说说MERGE的情况,例如有一个名为v_merge的视图有下列的定义:

    CREATE ALGORITHM = MERGE VIEW v_merge (vc1, vc2) AS SELECT c1, c2 FROM t WHERE c3 > 100;


  那么当有查询时,它是怎么个合并处理法呢,首先说当执行下列查询时:

    SELECT * FROM V_MERGE;

  MySQL在处理时按照下列的逻辑:

      
  • v_merge映射为t;
  •   
  • *映射成vc1,vc2,实际上是t表的c1,c2;
  •   
  • 而后增加where语句。

  那么实际执行的语句就是:

    SELECT c1,c2 FROM t where c3>100;

  如果执行下列语句的话:

    SELECT * FROM V_MERGE WHERE vc1<100;

  对于这个语句,WHERE之前的处理逻辑与前面的示例是相同的,最后再附加上视图的where语句,就变成了:

    SELECT c1,c2 FROM t where c3>100 and c1<100

  按照官方文档上的说法,实际上组合WHERE语句时是遵照这样的格式:

    WHERE (select WHERE) AND (view WHERE)

  不知道大家理解清楚了没有,接下来再看看TEMPTABLE的方式,这个就简单了,我感觉可以将其理解成类似ORACLE物化视图的概念,但在MySQL中它是个临时的物化视图,怎么个临时法呢,就是说物化只存在于查询那一刻---将视图的定义SQL生成实体临时表,对于视图的查询条件会在临时表上进行,包括传统的WHERE子句,以及像MERGE方式无法支持的DISTINCT、GROUP BY、HAVING等。

  TEMPTABLE方式的一个特点--不可更新,也与其临时的实现特性有关。

  那么,我们知道了MERGE方式的话无法支持像聚合查询、分组统计等应用,而TEMPTABLE方式的话又non-updatable,我们可能有时候无法确定视图究竟会怎么用,那就可以选择标准的UNDEFINED方式,也是默认的方式,由MySQL自己视情况确定了。

阅读(1220) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~