2013年(350)
分类: Mysql/postgreSQL
2013-04-11 15:59:44
MySQL数据库的CREATE/ALTER VIEW语句中的ALGORITHM子句是对标准语句所做的扩展。它的功能是确定MySQL如何处理视图。
一般ALGORITHM有三个值:MERGE、TEMPTABLE或UNDEFINCED,默认值是UNDEFINED(当没有指定ALGORITHM子句时)。
这些概念听起来都比较抽象,对于生在新长在红旗下普遍善良单纯无条件依附强权的无数蚁族来说,可能理解起来非常困难,其实用不着太过自卑,你这不是笨,你只是单纯。
下面结合例子来说明白,希望能够帮助理解。先来说说MERGE的情况,例如有一个名为v_merge的视图有下列的定义:
那么当有查询时,它是怎么个合并处理法呢,首先说当执行下列查询时:
MySQL在处理时按照下列的逻辑:
那么实际执行的语句就是:
如果执行下列语句的话:
对于这个语句,WHERE之前的处理逻辑与前面的示例是相同的,最后再附加上视图的where语句,就变成了:
按照官方文档上的说法,实际上组合WHERE语句时是遵照这样的格式:
不知道大家理解清楚了没有,接下来再看看TEMPTABLE的方式,这个就简单了,我感觉可以将其理解成类似ORACLE物化视图的概念,但在MySQL中它是个临时的物化视图,怎么个临时法呢,就是说物化只存在于查询那一刻---将视图的定义SQL生成实体临时表,对于视图的查询条件会在临时表上进行,包括传统的WHERE子句,以及像MERGE方式无法支持的DISTINCT、GROUP BY、HAVING等。
TEMPTABLE方式的一个特点--不可更新,也与其临时的实现特性有关。
那么,我们知道了MERGE方式的话无法支持像聚合查询、分组统计等应用,而TEMPTABLE方式的话又non-updatable,我们可能有时候无法确定视图究竟会怎么用,那就可以选择标准的UNDEFINED方式,也是默认的方式,由MySQL自己视情况确定了。