mysql - 提高 MySQL 查询性能 - 数学密集型查询

标签 mysql sql performance optimization

有人愿意帮我解决这个问题吗?以下查询在具有 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/

相关文章:

php - 使用pdo在php中上传多张图片

mysql - 重构多个表的连接

sql - 在触发之前不更新值postgresql

mysql - 优化在一行上链接两个表的查询

javascript - 使用复合外键时使用 Sequelize 的 "includes"问题

jQuery + AJAX 追加淡入淡出

c# - 获取由两个日期时间选择器选择的两天之间的记录,并在 Visual Studio C# 中用它们填充数据 GridView

c - 对具有固定数量的零的数组进行随机抽样

performance - TSX 相关的 Skylake 勘误表 SKL-105 的状态如何?

c# - 将 C# 转换为 C++ 按位移位