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 Server的物理内存“占用空间”

此外,由于嵌套查询的结构,SQL Server查询优化器将尝试找到从查询中派生结果的最佳方法。(即优化器将其转换为微操作,并进行重组以高效运行)

由于重新排序,很难说先运行哪个查询。然而,在优化之后,很可能会运行一种形式的内部查询(在大多数情况下,如果没有这种结果,您就无法真正执行任务)

SQL查询不像您想象的那样运行堆栈调用。它们是为机器理解和翻译的单行指令

这可能对你有帮助

有足够的内存可用于运行相当大的查询,并且查询的复杂性几乎不可能导致超时。为了提高速度,嵌套查询的优点是几乎完全在物理内存中运行,除非执行查询所需的内存量超过分配给SQL Server的物理内存“占用空间”

此外,由于嵌套查询的结构,SQL Server查询优化器将尝试找到从查询中派生结果的最佳方法。(即优化器将其转换为微操作,并进行重组以高效运行)

由于重新排序,很难说先运行哪个查询。然而,在优化之后,很可能会运行一种形式的内部查询(在大多数情况下,如果没有这种结果,您就无法真正执行任务)


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
的更多信息,请参阅:

嗯。。查询处理器首先将您编写的查询转换为关系操作,然后对这些操作执行优化。然后这些微操作将结合起来,给你你想要的结果。嗯。。查询处理器首先将您编写的查询转换为关系操作,然后对这些操作执行优化。然后,这些微操作将结合在一起,为您提供所需的结果。