有人愿意帮我解决这个问题吗?以下查询在具有 10000 行的 MEMORY 表上大约需要 18 秒。如果我没有“哪里”的限制,那么只需要不到一分钟的时间。我已打开查询缓存并尝试将其作为准备好的语句。有什么我可以做的吗?索引还是什么?
SELECT SQL_CACHE
date(todaydata.postdate) as postdate,
SUM(CASE when todaydata.amount > 0 THEN todaydata.amount ELSE 0 END) AS INFLOW,
SUM(CASE when todaydata.amount < 0 THEN todaydata.amount ELSE 0 END) AS OUTFLOW
FROM invoice as todaydata
LEFT JOIN invoice as yesterdaydata ON todaydata.postdate=DATE_ADD(yesterdaydata.postdate,interval -1 day)
where todaydata.postdate between now() - interval 2 month and now() + interval 1 month
GROUP BY date(todaydata.postdate)
最佳答案
我认为这会让您得到您想要的东西,但是您关心的滚动日期范围...我已经通过创建自己的“发票”表(其中标识了两列)进行了测试。实际上,使用可以在查询中内联使用的 @ mySQL 变量非常简单...唯一的事情是,现在有真正的方法可以知道“期初”余额是什么,所以我设置了初始值启动值为零,然后据此进行调整。
最关键的是“PreAgg”查询,它仅按输入/输出的日期本身进行聚合。然后,通过按日期顺序对结果进行排序,@sql 变量就会生效。
select
PreAgg.PostDate,
@PrevBal as BegBal,
PreAgg.OutFlows,
PreAgg.InFlows,
@PrevBal := @PrevBal + PreAgg.OutFlows + PreAgg.InFlows as EndBal
from
( select
i.postdate,
sum( if( i.amount < 0, i.amount, 0 ) ) as OutFlows,
sum( if( i.amount > 0, i.amount, 0 ) ) as InFlows
from
invoice i
where
i.postdate between date_sub( now(), interval 2 month )
and date_add( now(), interval 1 month )
group by
i.postdate
order by
i.postdate ) as PreAgg,
( select @PrevBal := 0.00 ) as SqlVars
但是,即使我给出了 3 个月的窗口(-2 个月,+1 个月),我认为这并没有真正意义,因为 future 的发布还不会发生......可能还更多重要的是拥有
where
i.postdate > date_sub( now(), interval 3 month )
它将获取从当前日期/时间算起的最近 3 个月的数据。
关于mysql - 提高 MySQL 查询性能 - 数学密集型查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8812696/