Mysql SQL嵌套查询处理
假设嵌套查询类似于:Mysql SQL嵌套查询处理,mysql,sql,Mysql,Sql,假设嵌套查询类似于: SELECT * FROM Table1 WHERE Table1.val in ( Select Table2.val from Table2 where Table2.val>3 ) 所以我的问题是,实际的查询处理器如何评估这个- 他们是否首先计算最内部的查询,暂时存储结果,然后在上层查询中使用它?[如果子查询的结果很大,临时存储可能不够] 或者他们是否为外部查询的每个结果计算外部查询[需要对外部查询进行太多计算] 我是否遗漏了什
SELECT *
FROM Table1
WHERE Table1.val in
(
Select Table2.val
from Table2
where Table2.val>3
)
所以我的问题是,实际的查询处理器如何评估这个-
- 他们是否首先计算最内部的查询,暂时存储结果,然后在上层查询中使用它?[如果子查询的结果很大,临时存储可能不够]
- 或者他们是否为外部查询的每个结果计算外部查询[需要对外部查询进行太多计算]
SQL查询不像您想象的那样运行堆栈调用。它们是为机器理解和翻译的单行指令 视情况而定。您可以在内部查询中引用外部查询中的值。如果您这样做,您就拥有了所谓的相关子查询或相关派生表。在这种情况下,它必须为父查询中的每个可能行重新计算查询。如果您不这样做,您就拥有所谓的内联视图或内联派生表,而且大多数数据库引擎都足够智能,只需计算一次视图。这取决于具体情况。您可以在内部查询中引用外部查询中的值。如果您这样做,您就拥有了所谓的相关子查询或相关派生表。在这种情况下,它必须为父查询中的每个可能行重新计算查询。如果您不这样做,您就拥有了所谓的内联视图或内联派生表,并且大多数数据库引擎都足够智能,只需计算一次视图。您可以使用
EXPLAIN
获取有关执行计划的信息,如下所示:
EXPLAIN SELECT *
FROM Table1
WHERE Table1.val in
(
Select Table2.val
from Table2
where Table2.val>3
)
例如,对于您的查询,您将得到
正如文件所述:
依赖子查询求值与不可缓存子查询求值不同。对于依赖子查询,对于外部上下文中变量的每一组不同值,子查询只重新计算一次。对于不可缓存的子查询,将为外部上下文的每一行重新计算子查询
所以你的第一个猜测是正确的
有关EXPLAIN
的更多信息,请参阅:
您可以使用
EXPLAIN
获取有关执行计划的信息,如下所示:
EXPLAIN SELECT *
FROM Table1
WHERE Table1.val in
(
Select Table2.val
from Table2
where Table2.val>3
)
例如,对于您的查询,您将得到
正如文件所述:
依赖子查询求值与不可缓存子查询求值不同。对于依赖子查询,对于外部上下文中变量的每一组不同值,子查询只重新计算一次。对于不可缓存的子查询,将为外部上下文的每一行重新计算子查询
所以你的第一个猜测是正确的
有关EXPLAIN
的更多信息,请参阅:
嗯。。查询处理器首先将您编写的查询转换为关系操作,然后对这些操作执行优化。然后这些微操作将结合起来,给你你想要的结果。嗯。。查询处理器首先将您编写的查询转换为关系操作,然后对这些操作执行优化。然后,这些微操作将结合在一起,为您提供所需的结果。