• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 视图处理算法

    ALGORITHM子句是标准SQL的MySQL扩展。它影响MySQL处理视图的方式。三个值:,或。CREATE VIEWALTER VIEWALGORITHMMERGETEMPTABLEUNDEFINED

    • 对于MERGE,引用视图的语句文本和视图定义将合并,以使视图定义的某些部分替换该语句的相应部分。
    • 对于TEMPTABLE,视图的结果被检索到临时表中,然后该表用于执行该语句。
    • 对于UNDEFINED,MySQL选择要使用的算法。它喜欢MERGETEMPTABLE如果可能的话,因为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, c2 FROM t WHERE c3 > 100;
    

    示例::假设我们发出以下语句:

    SELECT * FROM v_merge;
    

    MySQL处理该语句的方式如下:

    • v_merge变成t
    • *变成vc1, vc2,对应于c1, c2
    • WHERE添加了 view 子句

    要执行的结果语句变为:

    SELECT c1, c2 FROM t WHERE c3 > 100;
    

    示例::假设我们发出以下语句:

    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。有关详细信息,请参见“通过合并或实现来优化派生表,视图引用和公用表表达式”。