or
的可选ALGORITHM
子句
是 MySQL 对标准 SQL 的扩展。它会影响 MySQL 处理视图的方式。
取三个值:
、或
。
CREATE VIEW
ALTER VIEW
ALGORITHM
MERGE
TEMPTABLE
UNDEFINED
对于
MERGE
,引用视图的语句文本和视图定义被合并,以便视图定义的部分替换语句的相应部分。对于
TEMPTABLE
,视图的结果被检索到临时表中,然后用于执行语句。对于
UNDEFINED
,MySQL 选择使用哪种算法。如果可能的话,它会优先选择,因为MERGE
通常 效率更高,而且如果使用临时表,视图将无法更新。TEMPTABLE
MERGE
如果不存在
ALGORITHM
子句,则默认算法由 系统变量derived_merge
标志的 值确定。optimizer_switch
有关其他讨论,请参阅 第 8.2.2.4 节,“使用合并或实现优化派生表和视图引用”。
明确指定的一个原因TEMPTABLE
是可以在创建临时表之后和使用它完成处理语句之前释放基础表上的锁。这可能导致比该MERGE
算法更快的锁定释放,从而使使用该视图的其他客户端不会被阻塞太久。
视图算法可能UNDEFINED
出于三个原因:
声明中没有
ALGORITHM
子句CREATE VIEW
。该
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
becomec1 <
100
并且使用连接词将视图WHERE
子句添加到语句WHERE
子句
AND
(并添加圆括号以确保子句的各部分以正确的优先级执行)。要执行的结果语句变为:
SELECT c1, c2 FROM t WHERE (c3 > 100) AND (c1 < 100);
实际上,要执行的语句具有
WHERE
以下形式的子句:
WHERE (select WHERE) AND (view WHERE)
如果MERGE
不能使用该算法,则必须使用临时表代替。防止合并的构造与防止在派生表中合并的构造相同。示例是SELECT DISTINCT
或
LIMIT
在子查询中。有关详细信息,请参阅
第 8.2.2.4 节,“使用合并或实现优化派生表和视图引用”。