MySQL查询优化器使用多种不同的策略来评估子查询:
- 对于使用IN,= ANY,或EXISTS的子查询,优化器有以下选项:
- 半连接
- 物化
- EXISTS策略
- 对于使用NOT IN,<> ALL或NOT EXISTS的子查询,优化器有以下选择:
- 物化
- EXISTS策略 对于派生表,优化器有以下选择(这也适用于视图引用和普通表表达式):
- 将派生表合并到外部查询中
- 将派生表转换为内部临时表 下面将详细介绍上面这些优化策略。
对使用子查询来修改单表的UPDATE语句和DELETE语句来说,优化器不会使用半连接和物化子查询优化。作为变通,尝试将其重写为使用连接的语句,而非使用子查询的语句。