我有一个SQL查询(MYSQL),我希望速度更快。一般的问题是对具有聚合条件的不同键进行计数。也就是说,我喜欢将具有相同键值的行中的列的值相加,然后确定是否应将其包括在计数中。我想出的唯一解决方案是使用子查询进行求和,然后在外部查询中使用having there计算distinct。像这样:
SELECT COUNT(DISTINCT key), sum1, sum2, categoryid
FROM
(
SELECT SUM(cnt1) AS sum1,
SUM(cnt2) AS sum2,
key,categoryid
FROM table
GROUP BY key,categoryid
) as SUBQUERY
GROUP BY categoryid
HAVING (8*sum1)/sum2 > 0;问题(在我看来)是查询使用子查询,它将生成一个临时表。由于数据集很大(10M行,500K不同的键),这需要大量的时间。看起来应该可以做得更好,因为没有条件的直接distinct计数只需要这个查询时间的十分之一,没有分组的求和只需要很少的时间。
有没有人有关于如何提高性能的想法?
提前感谢!
Lasse
发布于 2015-09-02 15:09:03
实际上,我能够通过将计数distinct转移到内部查询来缩短响应时间。不知道为什么我没早点看出来。显然会使临时表变小。然而,它仍然比没有条件的distinct计数慢4-5倍。
新的select如下所示:
SELECT dist_cnt,sum1,sum2,categoryid FROM ( SELECT COUNT(DISTINCT key) AS dist_cnt,SUM(cnt1) AS sum1,SUM(cnt2) AS sum2,key,categoryid FROM table GROUP BY key,categoryid ) as子查询
其中(8*sum1)/sum2 >0按类别BY分组
无论如何,我认为它应该有可能至少快2倍。Lasse
https://stackoverflow.com/questions/32330720
复制相似问题