首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行流程- mySQL

问执行流程- mySQL
EN

Stack Overflow用户
提问于 2016-02-29 20:50:32
回答 1查看 339关注 0票数 1

我在MySQL中的查询如下:

代码语言:javascript
复制
    SELECT *, min(start_date_time) as min_start_date_time
    FROM result_table
    where part_number= '101'
    group by part_serial;

我原以为查询将按part_serial对结果进行分组,然后将为给定的part_serial创建一个新的列'min_start_date_time',该列在每一行中具有最小的start_date_time。

但是我得到的是,每个part serial只有1行,其中start_date_time是给定serial的最小值。

有人能解释一下这个查询的执行流程吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-29 21:25:58

除了为聚合函数计算创建边界外,听起来您还期望GROUP子句更像是ORDER子句,只需在结果中强制组中的行彼此相邻。事实并非如此。group BY子句实际上将筛选一个结果集,将每个组降为一行。

有人能解释一下这个查询的执行流程吗?

我会尝试一下,但请记住,这是一个非常简化的流程。不需要花费太多的时间就可以得到比这更复杂的东西,而且当查询引擎认为它可以产生更快或更有效的计划时,数据库可以使用统计数据和索引来改变这个基本的查询流。我也不能把它留给这个查询,因为解释流程流而不给联接和其他复杂性至少一个提示就会产生一些误导性的解释。把免责声明让开,让我们开始吧。

该过程从规划阶段开始,以确定表空间。也就是说,数据库计算FROM子句使用的表以及任何联接中的表或视图的匹配规则。除了可能的记录指针或主键之外,它实际上不会将这些内容加载到内存中。现在,它只是计算表的匹配规则,并确定完成联接和生成结果行的最有效方法。

例如,您可以连接到一个表,其中有5列,其中联接条件与第三列中的外键匹配,但表的主键是第一列,select列表最终只使用第四列中的数据。在此阶段,数据库正在构建计划,以便以最快的方式用原始表加载每个记录的第四列数据。可能有一个包含第3和第4列的索引来满足查询,也可能需要通过第1列中的主键从原始表中加载数据。

对于像这个问题这样的单表查询,所有这一切通常只是一个确定查询是否能从索引中完全满足的问题,但它仍然是这个过程的一个重要部分。

完成后,数据库将开始检查查询的主/原始表中的行。数据库将首先应用WHERE子句的相关部分(希望能够很好地利用索引),以使工作集保持较小。然后,它提取与上一步中确定的规则相匹配的任何已连接表的数据。它在执行此操作时应用WHERE子句的任何剩余元素,希望利用联接表上的有用索引.同样,为了保持查询的内存和磁盘使用率尽可能低,并尽可能快地释放不必要的信息。

有时,当一个联接匹配目标表中的多个记录时,此进程将实现新的行,但该过程将一直持续到计算出一个起始行的整个结果为止。

在完成每个物化行时,可以应用GROUP BY子句。这是通过查看行并识别该行所属的组来实现的。此时,该行将合并(而不是复制)到一个新的工作集中(如果没有GROUP子句,可以跳过该操作集)。如果新集合已经有一个与组匹配的行,那么它只更新任何聚合函数计算(添加1来计数该组,检查我们是否有新的最大值或最小,更新最终允许AVG计算的和,等等)。如果新集没有该组的行,则将在集合中创建一行,其中包含当前行的种子数据。当数据库完成原始集中的行时,它们可以被丢弃。完成整个GROUP子句后,查询不再需要原始工作集。

此时,可以对HAVING子句(如果有的话)以及ORDER子句进行计算。

最后,数据库开始将结果流到客户端应用程序。当每一行被流时,SELECT子句指定的任何转换都会被执行,并包含在最终的结果集中。注意,如果您没有GROUP、ORDER子句、DISTINCT或窗口函数,流可以在第一条记录准备好之后立即开始。如果您有这些内容,则必须构建整个结果集,以便知道如何执行流,直到最后一条记录准备就绪后才能开始。就初始延迟和服务器上的资源使用而言,这对于性能来说都是巨大的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35709365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档