27.5.2 视图处理算法
MySQL 扩展了标准 SQL 的可选 ALGORITHM
子句,以影响 MySQL 处理视图。ALGORITHM
可以取三个值:MERGE
、TEMPTABLE
或 UNDEFINED
。
-
对于
MERGE
,将视图定义与语句合并,以便将视图定义中的部分替换语句中的相应部分。 -
对于
TEMPTABLE
,将结果从视图中检索到临时表,然后使用该临时表执行语句。 -
对于
UNDEFINED
,MySQL 将选择算法。如果可能,MySQL 将首选MERGE
,因为MERGE
通常更高效,并且视图不能被更新,如果使用临时表。 -
如果不指定
ALGORITHM
子句,MySQL 将根据derived_merge
标志的值来确定默认算法。有关详细信息,请参阅第10.2.2.4节,“优化派生表、视图引用和公共表达式的合并或物化”。
指定 TEMPTABLE
可以释放锁,使得其他客户端可以更快地访问视图。
视图算法可以是 UNDEFINED
的原因有三个:
-
没有在
CREATE VIEW
语句中指定ALGORITHM
子句。 -
在
CREATE VIEW
语句中指定了ALGORITHM = UNDEFINED
子句。 -
ALGORITHM = MERGE
指定了一个只能使用临时表的视图。在这种情况下,MySQL 将生成警告并将算法设置为UNDEFINED
。
如前所述,MERGE
算法是将视图定义中的部分合并到语句中。以下示例简要介绍了 MERGE
算法的工作原理。示例假设有一个视图 v_merge
,其定义如下:
CREATE ALGORITHM = MERGE VIEW v_merge (vc1, vc2) AS
SELECT c1, c2 FROM t WHERE c3 > 100;
示例 1:假设我们发出以下语句:
SELECT * FROM v_merge;
MySQL 将处理语句如下:
-
v_merge
变为t
-
*
变为vc1, vc2
c1, c2
-
添加了视图
WHERE
子句
执行的语句变为:
SELECT c1, c2 FROM t WHERE c3 > 100;
示例2:假设我们发出以下语句:
SELECT * FROM v_merge WHERE vc1 < 100;
这条语句的处理方式与前一个类似,只是
vc1 < 100
变为c1 < 100
,并将视图WHERE
子句添加到语句WHERE
子句中,使用AND
连接符(并添加括号以确保子句的执行顺序)。执行的语句变为:
SELECT c1, c2 FROM t WHERE (c3 > 100) AND (c1 < 100);
实际上,执行的语句具有以下形式的
WHERE
子句:
WHERE (select WHERE) AND (view WHERE)
如果不能使用
MERGE
算法,必须使用临时表代替。阻止合并的构造与derived表和common table expressions中的阻止合并构造相同。示例包括SELECT DISTINCT
或LIMIT
在子查询中。详细信息,请见第10.2.2.4节,“Optimizing Derived Tables, View References, and Common Table Expressions with Merging or Materialization”。