### 25.5.2 查看处理算法

[](<>)

可选的`算法`条款[`创建视图`](create-view.html)要么[`改变视图`](alter-view.html)是标准 SQL 的 MySQL 扩展。它影响 MySQL 处理视图的方式。`算法`取三个值：`合并`,`可取的`， 要么`不明确的`.

-   为了`合并`，引用视图的语句文本和视图定义被合并，使得视图定义的部分替换语句的相应部分。

-   为了`可取的`，视图的结果被检索到一个临时表中，然后用于执行语句。

-   为了`不明确的`, MySQL 选择使用哪种算法。它更喜欢`合并`超过`可取的`如果可能的话，因为`合并`通常效率更高，因为如果使用临时表，则视图无法更新。

-   如果不`算法`子句存在时，默认算法由[`派生合并`](switchable-optimizations.html#optflag_derived-merge)国旗[`优化器开关`](server-system-variables.html#sysvar_optimizer_switch)系统变量。有关其他讨论，请参阅[第 8.2.2.4 节，“通过合并或实现优化派生表、视图引用和公用表表达式”](derived-table-optimization.html).

    指定的理由`可取的`明确的是，可以在创建临时表之后并且在它用于完成语句处理之前释放基础表上的锁。这可能会导致比`合并`算法，以便使用该视图的其他客户端不会被阻塞太久。

    视图算法可以是`不明确的`出于三个原因：

-   不`算法`子句出现在[`创建视图`](create-view.html)陈述。

-   这[`创建视图`](create-view.html)声明有一个明确的`算法 = 未定义`条款。

-   `算法 = 合并`为只能使用临时表处理的视图指定。在这种情况下，MySQL 会生成一个警告并将算法设置为`不明确的`.

    如前面提到的，`合并`通过将视图定义的相应部分合并到引用该视图的语句中来处理。以下示例简要说明了`合并`算法有效。这些例子假设有一个视图`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`变成`吨`

-   `*`变成`vc1, vc2`，对应于`c1, c2`

-   风景`在哪里`添加了子句

    要执行的结果语句变为：


```
SELECT c1, c2 FROM t WHERE c3 > 100;
```

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

```
SELECT * FROM v_merge WHERE vc1 < 100;
```

此语句的处理方式与前一个类似，不同之处在于`vc1 < 100`变成`c1 < 100`和视图`在哪里`子句被添加到语句中`在哪里`子句使用[`和`](logical-operators.html#operator_and)连接词（并添加括号以确保子句的部分以正确的优先级执行）。要执行的结果语句变为：

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

实际上，要执行的语句具有`在哪里`这种形式的条款：

```
WHERE (select WHERE) AND (view WHERE)
```

如果`合并`不能使用算法，必须使用临时表。阻止合并的构造与阻止在派生表和公用表表达式中合并的构造相同。例子是`选择不同的`要么`限制`在子查询中。有关详细信息，请参阅[第 8.2.2.4 节，“通过合并或实现优化派生表、视图引用和公用表表达式”](derived-table-optimization.html).
