MySQL 8.0 参考手册  / 第25章存储对象  / 25.5 使用视图  /  20.5.2 视图处理算法

20.5.2 视图处理算法

or 的可选ALGORITHM子句 是 MySQL 对标准 SQL 的扩展。它会影响 MySQL 处理视图的方式。 取三个值: 、或 。 CREATE VIEWALTER VIEWALGORITHMMERGETEMPTABLEUNDEFINED

  • 对于MERGE,引用视图的语句文本和视图定义被合并,以便视图定义的部分替换语句的相应部分。

  • 对于TEMPTABLE,视图的结果被检索到临时表中,然后用于执行语句。

  • 对于UNDEFINED,MySQL 选择使用哪种算法。如果可能的话,它会优先选择,因为 MERGE通常 效率更高,而且如果使用临时表,视图将无法更新。 TEMPTABLEMERGE

  • 如果不存在ALGORITHM子句, UNDEFINED则为默认算法。

明确指定的一个原因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 < 100becomec1 < 100并且使用连接词将视图WHERE子句添加到语句WHERE子句 AND(并添加圆括号以确保子句的各部分以正确的优先级执行)。要执行的结果语句变为:

SELECT c1, c2 FROM t WHERE (c3 > 100) AND (c1 < 100);

实际上,要执行的语句具有 WHERE以下形式的子句:

WHERE (select WHERE) AND (view WHERE)

如果MERGE不能使用该算法,则必须使用临时表代替。MERGE 如果视图包含以下任何构造,则不能使用:

  • 聚合函数(SUM()MIN()MAX()COUNT()等)

  • DISTINCT

  • GROUP BY

  • HAVING

  • LIMIT

  • UNION或者 UNION ALL

  • 选择列表中的子查询

  • 分配给用户变量

  • 仅指文字值(在这种情况下,没有基础表)