MySQL 8.4 Reference Manual  /  ...  /  View Processing Algorithms

27.5.2 视图处理算法

MySQL 扩展了标准 SQL 的可选 ALGORITHM 子句,以影响 MySQL 处理视图。ALGORITHM 可以取三个值:MERGETEMPTABLEUNDEFINED

  • 对于 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, vc2c1, 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 DISTINCTLIMIT在子查询中。详细信息,请见第10.2.2.4节,“Optimizing Derived Tables, View References, and Common Table Expressions with Merging or Materialization”