CREATE VIEW或ALTER VIEW的可选算法子句是标准SQL的MySQL扩展。它影响MySQL处理视图的方式。算法接受三个值:合并、可试探或未定义。
对于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添加了 view 子句
要执行的结果语句变为:
SELECT c1, c2 FROM t WHERE c3 > 100;
示例2:假设我们发出以下语句:
SELECT * FROM v_merge WHERE vc1 < 100;
该语句的处理与上一个语句相似,不同之处在于,vc1 < 100变为,c1 < 100并使用WHERE连接词将view 子句添加到该语句WHERE子句中 AND(并添加括号以确保该子句的各个部分以正确的优先级执行)。要执行的结果语句变为:
SELECT c1, c2 FROM t WHERE (c3 > 100) AND (c1 < 100);
实际上,要执行的WHERE语句具有以下形式的 子句:
WHERE (select WHERE) AND (view WHERE)
如果MERGE无法使用该算法,则必须使用临时表。防止合并的构造与防止在派生表和公用表表达式中进行合并的构造相同。示例是SELECT DISTINCT或LIMIT在子查询中。