首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分组SQL查询中按范围高效计算结果数

问分组SQL查询中按范围高效计算结果数
EN

Stack Overflow用户
提问于 2012-06-05 20:46:06
回答 1查看 106关注 0票数 0

我正在使用一个相当大的数据库,其中的每一行都有一个特定的类。每个类又属于一个泛化类,它在一个单独的表中指定。因此,为了找到项目的广义类,必须执行连接。

另外,其中一列包含某个数值,比如'w‘。我正在尝试找到一个有效的查询,它给出了一个特定范围'w‘内的项数,并按泛化类分组。因此,例如,其中一个结果行将给出该类中w< 500,500 1500的项数的细分。

现在,我使用了一个预先存在的视图,它已经将泛化类联接到结果集中,因此在最后的查询中不需要联接。最后一个查询使用了我发现的here的技巧来计算特定范围内的项目数量。

代码语言:javascript
复制
SELECT generalized_class, 
    SUM(IF(w BETWEEN 1 AND 500, 1, 0)) AS low, 
    SUM(IF(w BETWEEN 500 AND 1500, 1, 0)) AS middle,
    SUM(IF(w > 1500, 1, 0)) AS high
FROM table_vw
GROUP BY generalized_class

然而,我不太确定这是否是最有效的方法。由于数据库相当大,整个过程需要五分钟以上的时间才能完成。我认为计算这类东西通常是一个昂贵的操作,但我只是在想,我是否可以使用一种不同的方法来消除一些负载。有没有人?

-编辑-视图的定义不是什么壮观的东西,它类似于

代码语言:javascript
复制
CREATE VIEW table_vw AS SELECT d.id, d.class, c.generalized_class, <more fields>, 
(w_high/w_low)/2 AS w
FROM base_table d
LEFT OUTER JOIN secondary_table c   
    ON (d.class = c.class)

我非常确定另一个表还有一个左外部连接,但是没有使用该表中的行(正如我所说的,它是一个预先存在的视图,所以其中有很多东西不是为这个查询量身定做的)。联接行'class‘仅在辅助表中被索引。

EN

回答 1

Stack Overflow用户

发布于 2012-06-05 21:48:28

查询执行时间如此之长的原因可能是它没有正确使用索引(或者根本不使用它们!)。使用EXPLAIN查看MySQL如何执行查询。

http://dev.mysql.com/doc/refman/5.5/en/explain.html

另一个原因可能是MySQL首先计算视图的整个结果,然后使用该结果计算整个查询的结果。

在这种情况下,一种解决方案是将视图定义与查询合并。

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

https://stackoverflow.com/questions/10897571

复制
相关文章

相似问题

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