我知道如何correlated subqueries
工作,通常会避开它们。.但是对于我想做的事情,我找不到其他写此查询的方法。我可以使用它,因为我在使用的表中没有一堆记录..但是现在我需要对其中包含> 100,000条记录的某些表执行相同的操作,这会使此查询花费很长时间时间。因此我需要一些帮助来重写此查询。
初始查询:
SELECT
DATE(m.Created_At) AS m_date,
COUNT(m.id) AS daily_count,
(
SELECT
COUNT(m1.id)
FROM members_joined m1
WHERE m1.has_verified = 1 and DATE(m1.Created_At) <= m_date
) AS member_totals
FROM members_joined AS m
WHERE m.has_verified = 1 and m.Created_At BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE()
GROUP BY m_date;
该查询正在执行的操作是获取最多30天之前的注册成员总数。然后在最近30天之间的每一天再次进行总计
m_date daily_count member_totals
2014-05-27 4 619
2014-05-29 1 620
2014-05-30 3 623
2014-06-02 4 627
2014-06-03 7 634
2014-06-04 10 644
2014-06-05 12 656
2014-06-06 4 660
2014-06-07 3 663
2014-06-08 3 666
2014-06-09 3 669
2014-06-10 5 674
2014-06-11 3 677
如果你发现它是增加由计数每个每日计数。
该查询本身只需要0.036秒即可运行,这没什么大不了的
但是在一些较大的桌子上,它已经花费了12秒,而且它们只会变得更大。
注意:可以在不使用相关子查询的情况下完成此操作吗?假设您不能使用用户定义的变量。
如果无法在mysql中完成此操作,则可以两次访问数据库,然后在python中完成此操作,但是我希望能在MySQL中找到一种解决方案,而不是多次访问数据库。
感谢您的任何指示/帮助!
使用纯SQL很难做到这一点,但是您可以使用MySQL特定的用户定义变量。您只需要计算每天的计数并累积每一行的计数。
主要技巧是强制MySQL以正确的顺序更新变量。
该查询应如下所示(不确定它是否100%正确):
SELECT m_date, daily_count, @count:=(daily_count + @count) as member_totals
FROM
(SELECT DATE(Created_At) as m_date, COUNT(*) as daily_count
FROM members_joined
WHERE DATE(Created_At) >= CURDATE() - INTERVAL 30 DAY AND has_verified = 1
GROUP BY m_date
) as days,
(SELECT @count:=COUNT(*) as cnt0
FROM members_joined
WHERE DATE(Created_At) < CURDATE() - INTERVAL 30 DAY
AND has_verified = 1) as init
ORDER BY m_date;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句