为什么子查询与组完全扫描两次?

时间:2018-06-12 10:06:39

标签: mysql sql

我正在测试两种类型的查询。 第一种类型如下所示:

explain select * from ord_order;  

explain select * from (select * from ord_order) as tbl;

这两个执行计划显示相同的行为(完全扫描一次)。

但是,第二种类型如下所示:

explain select * from ord_order 
        group by bundle_or_order_number;  

explain select * from 
        (select * from ord_order 
         group by bundle_or_order_number) as tbl;

第二个查询执行两次完整扫描!

有人可以解释一下吗?感谢。

1 个答案:

答案 0 :(得分:0)

首先,它无关紧要,因为您的查询格式不正确。不要将select *group by一起使用。它只是没有意义 - 当前版本的MySQL不支持它。问题是:列来自哪些行?您应该使用聚合函数。

为什么两个查询不同?在MySQL术语中,区别在于派生表(from子句中的子查询)是否具体化。子查询是否具体化取决于子查询的性质以及MySQL在您使用的版本中决定做什么。

您可以阅读documentation中优化派生表的信息。