首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >group by having limit如何工作

问group by having limit如何工作
EN

Stack Overflow用户
提问于 2016-08-08 19:15:27
回答 3查看 2.5K关注 0票数 5

有人能解释一下构造是如何通过+ having + limit准确地工作的吗?MySQL查询:

代码语言:javascript
复制
    SELECT
        id,
        avg(sal)
    FROM
        StreamData 
    WHERE
        ...
    GROUP BY
        id 
    HAVING
        avg(sal)>=10.0 
        AND avg(sal)<=50.0   
    LIMIT 100

查询without limit和having子句执行7秒,with limit -如果条件覆盖大量数据,立即执行,否则执行~7秒。文档指出,限制在group by之后执行,这意味着查询应该始终执行约7秒。请帮我弄清楚什么是限制条款。

EN

回答 3

Stack Overflow用户

发布于 2016-08-08 19:23:50

使用LIMIT 100只是告诉MySQL只返回结果集中的前100条记录。假设您将查询时间度量为从Java往返,那么查询时间的一个组成部分是在网络上移动来自MySQL的结果集所需的网络时间。对于较大的结果集,这可能需要相当长的时间,使用LIMIT 100可以将这段时间减少到零或接近零。

票数 3
EN

Stack Overflow用户

发布于 2016-08-08 19:30:57

在SQL中,事物在逻辑上应用于某个管道中:

将生成并执行有限表表达式(已应用列列表、JOIN)

  • Rows filtered (WHERE)

  • Projections和aggregations (列列表、aggregates、GROUP BY)

  • Aggregations filtered (HAVING)

  • Results (FROM、OFFSET)

现在,如果这是安全的,规划者可能会将它们组合成不同的执行顺序,但如果您按此顺序考虑,您总是会得到正确的数据。

因此,group by group,然后使用having过滤这些组,然后截断结果。

票数 3
EN

Stack Overflow用户

发布于 2016-08-08 19:33:43

只要MySQL向客户端发送了所需的行数,它就会中止查询,除非您使用的是SQL_CALC_FOUND_ROWS。然后可以使用SELECT FOUND_ROWS()检索行数。请参阅第13.14节“信息功能”。

http://dev.mysql.com/doc/refman/5.7/en/limit-optimization.html

这实际上意味着,如果您的表有相当多的行,服务器不需要查看所有行。一旦找到100,它就会停止,因为它知道这就是您所需要的。

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

https://stackoverflow.com/questions/38827817

复制
相关文章

相似问题

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