MySQL查询优化器有不同的策略来计算子查询:
对于与之使用的子查询在,=任何,或存在谓词,优化器有这些选择:
在
=任何
存在
semijoin.
物质化
存在战略
对于与a一起使用的子查询不是在,< >所有或者不存在谓词,优化器有这些选择:
不是在
< >所有
不存在
对于派生表,优化器具有这些选择(也适用于查看引用和常见表表达式):
将派生表合并到外部查询块中
将派生表物化为内部临时表
下面的讨论提供了有关上述优化策略的更多信息。
一个限制更新和删除使用子查询修改单个表的语句是优化器不使用Semijoin或实现子查询优化。作为解决方法,尝试将它们重写为多表更新和删除使用连接而不是子查询的语句。
更新
删除