### 8.2.2 优化子查询、派生表、视图引用和公用表

表达式

[8.2.2.1 使用半连接变换优化 IN 和 EXISTS 子查询谓词](semijoins.html)
[8.2.2.2 使用物化优化子查询](subquery-materialization.html)
[8.2.2.3 使用 EXISTS 策略优化子查询](subquery-optimization-with-exists.html)
[8.2.2.4 使用合并或实现优化派生表、视图引用和公用表表达式](derived-table-optimization.html)
[8.2.2.5 导出条件下推优化](derived-condition-pushdown-optimization.html)

[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

MySQL 查询优化器有不同的策略可用于评估子查询：

-   对于与`在`, `= 任何`， 要么`存在`谓词，优化器有以下选择：

    -   半连接

    -   物化

    -   `存在`战略

-   对于与 a 一起使用的子查询`不在`, `<> 全部`要么`不存在`谓词，优化器有以下选择：

    -   物化

    -   `存在`战略

    对于派生表，优化器有以下选择（也适用于视图引用和公用表表达式）：

-   将派生表合并到外部查询块中

-   将派生表具体化为内部临时表

    以下讨论提供了有关上述优化策略的更多信息。

笔记

一个限制[`更新`](update.html)和[`删除`](delete.html)使用子查询修改单个表的语句是优化器不使用半连接或物化子查询优化。作为一种解决方法，尝试将它们重写为多表[`更新`](update.html)和[`删除`](delete.html)使用连接而不是子查询的语句。
