回答

收藏

提高MySQL查询性能-数学重查询

技术问答 技术问答 95 人阅读 | 0 人回复 | 2023-09-13

有人愿意帮助我吗?在具有10000行的MEMORY表上,以下查询大约需要18秒。如果我没有“3 c1 h  Z- H7 T9 j
where”约束,则只需不到一分钟的时间。我已经打开查询缓存以及将其作为准备好的语句来尝试。有什么我可以做的吗?索引还是什么?$ E+ h2 k, H# T2 @
SELECT SQL_CACHE" M3 Y- P+ _: @& o+ Y
date(todaydata.postdate) as postdate,
0 u( [% G# `) E, z+ f4 ySUM(CASE when todaydata.amount > 0 THEN todaydata.amount ELSE 0 END) AS INFLOW,
) A* C! \9 k# y6 n$ N: mSUM(CASE when todaydata.amount 我认为这将为您提供所需的信息,而不管您关注的滚动日期范围…我已经通过创建带有两个标识列的自己的“发票”表进行了测试。使用@mySQL变量实际上非常简单,可以在查询中内联使用…唯一的是,现在有了一种真正的方法来知道什么是“期初”余额,因此我将初始值设置为启动值为零,然后从中进行调整。
3 S+ G# O7 k" F最重要的是“ PreAgg”查询,它仅按输入/输出日期本身的日期进行汇总。然后,通过按日期顺序对结果进行排序,@ sql变量将启动。( O. i2 h2 K. P6 p5 \3 S
select. q6 i) L% F+ W9 ]* l+ k5 a
      PreAgg.PostDate,5 s8 F3 n6 A" V4 m- ]8 o
      @PrevBal as BegBal,6 H4 b9 |4 R' n5 V( W7 g
      PreAgg.OutFlows,. ]  G  m$ \/ d& n& q2 H  @
      PreAgg.InFlows,
) j+ p  q/ w1 i: B' b2 R      @PrevBal := @PrevBal + PreAgg.OutFlows + PreAgg.InFlows as EndBal
# Z6 @! `- D. T# V   from
) \# y2 s9 _# [, C% y# T. w      ( select
* {- D: e# x# k              i.postdate,# K/ y: _1 C% S) L& S
              sum( if( i.amount  0, i.amount, 0 ) ) as InFlows; g. S" h  G; ~
           from
7 A9 a( _# H; `" j              invoice i
) ]5 h1 x( b5 g( x( k, f5 y3 a2 R9 Q           where
0 h- S7 v8 y" q  f$ p              i.postdate between date_sub( now(), interval 2 month )- y( x% W) q( u) u/ k5 S9 d
                             and date_add( now(), interval 1 month )
5 B3 ^7 `, I1 U           group by
3 e0 O4 S7 n! w0 t+ Q# S              i.postdate
- H' |/ J: P5 Q; F           order by
4 D/ V( T! b/ T              i.postdate ) as PreAgg,2 w9 X' a3 k1 [
      ( select @PrevBal := 0.00 ) as SqlVars
8 [' K! W5 g& g. p& k( Q* _: K但是,即使我给了3个月的窗口期(-2个月,+ 1个月),我也不认为这真的有道理,因为将来的发布还不会发生……更重要的是只是有  ?( h6 }0 }9 i7 m
       where
, n: P" X* d4 i  i1 ?: E          i.postdate > date_sub( now(), interval 3 month )
, N5 I* O: X, n5 O4 n4 x从当前日期/时间开始的最后3个月。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则