Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

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

27.5.2 视图处理算法

可选的 ALGORITHM 子句用于 CREATE VIEWALTER VIEW 是 MySQL 对标准 SQL 的扩展。它影响 MySQL 如何处理视图。ALGORITHM 取三个值:MERGETEMPTABLEUNDEFINED

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

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

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

  • 如果没有 ALGORITHM 子句,缺省算法将由 derived_merge 标志的 optimizer_switch 系统变量的值确定。有关更多讨论,请参阅 第 10.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 变为 c1 < 100,并且视图 WHERE 子句被添加到语句 WHERE 子句中使用 AND 连接符(并添加括号以确保子句的执行顺序正确)。执行的语句变为:

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

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

WHERE (select WHERE) AND (view WHERE)

如果 MERGE 算法不能使用,必须使用临时表代替。阻止合并的构造与派生表和公共表表达式中的构造相同。例如,子查询中的 SELECT DISTINCTLIMIT。有关详细信息,请参阅 第 10.2.2.4 节,“优化派生表、视图引用和公共表表达式的合并或物化”