视图处理算法
ALGORITHM
子句是标准SQL的MySQL扩展。它影响MySQL处理视图的方式。三个值:,或。CREATE VIEW
ALTER VIEW
ALGORITHM
MERGE
TEMPTABLE
UNDEFINED
- 对于
MERGE
,引用视图的语句文本和视图定义将合并,以使视图定义的某些部分替换该语句的相应部分。 - 对于
TEMPTABLE
,视图的结果被检索到临时表中,然后该表用于执行该语句。 - 对于
UNDEFINED
,MySQL选择要使用的算法。它喜欢MERGE
在TEMPTABLE
如果可能的话,因为MERGE
通常是更高效的并且因为如果使用临时表的视图不能更新。 - 如果没有
ALGORITHM
子句,则默认算法由系统变量的derived_merge
标志值确定optimizer_switch
。有关更多讨论,请参见“通过合并或实现来优化派生表,视图引用和公用表表达式”。
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, c2FROM tWHERE c3 > 100;
示例::假设我们发出以下语句:
SELECT *FROM v_merge;
MySQL处理该语句的方式如下:
v_merge
变成t
*
变成vc1, vc2
,对应于c1, c2
WHERE
添加了 view 子句
要执行的结果语句变为:
SELECT c1, c2FROM tWHERE c3 > 100;
示例::假设我们发出以下语句:
SELECT *FROM v_mergeWHERE vc1 < 100;
该语句的处理与上一个语句相似,不同之处在于,vc1 < 100
变为,c1 < 100
并使用WHERE
连接词将view 子句添加到该语句WHERE
子句中AND
(并添加括号以确保该子句的各个部分以正确的优先级执行)。要执行的结果语句变为:
SELECT c1, c2FROM tWHERE (c3 > 100) AND (c1 < 100);
实际上,要执行的WHERE
语句具有以下形式的子句:
WHERE (select WHERE ) AND (view WHERE )
如果MERGE
无法使用该算法,则必须使用临时表。防止合并的构造与防止在派生表和公用表表达式中合并的构造相同。子查询中有SELECT DISTINCT
或的示例LIMIT
。有关详细信息,请参见“通过合并或实现来优化派生表,视图引用和公用表表达式”。