2012-01-11 44 views
0

任何人都願意幫助我嗎?以下查詢在具有10000行的MEMORY表上大約需要18秒。如果我沒有「哪裏」限制,那隻需要一分鐘。我打開了查詢緩存並將其作爲準備好的語句嘗試。有什麼我可以做的嗎?索引還是什麼不?增加MySQL查詢性能 - 數學量大查詢

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) 
+0

它看起來像你試圖得到一個滾動的每日流入/流出設置爲一個給定的3個月期限,按個別日期分組......爲什麼你從「今日」加入到「昨天-1」(這將實際上是一個2天的差異,而不是「昨天+1」來匹配當前的日期。你對輸出的整體意圖是什麼。 – DRapp 2012-01-11 00:53:16

+0

確認,抱歉,好點。這個查詢是關於我的SQL知識如此變得如此粗糙對於我來說,在這一點上,我有一張交易表,它發生的日期和金額,試圖讓每天的總額從當天的流入和流出中得到,最終的遊戲是每天的開始平衡,流入,流出並結束餘額:) – 2012-01-11 01:06:42

回答

3

我認爲這將讓你你你想要但滾動的日期範圍是什麼關心......我用確定的兩列創建我自己的「發票」表測試。實際上,使用可以在查詢中內聯使用的@ mySQL變量非常簡單...唯一的是,現在有了解真正的「開放」平衡的真實方法,所以我設置了初始值零的啓動值然後從那裏調整。

kicker是「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月),我不知道認爲真正有意義的,因爲未來的帖子將不會發生尚未...什麼可能是更重要的是隻是有

 where 
      i.postdate > date_sub(now(), interval 3 month) 

將從當前的日期/時間得到最後的3個月。

+0

這太棒了。它的近乎瞬間。我的下巴在地面上。 – 2012-01-11 18:18:08

+2

@CharlieDavis,使用MySQL變量可能非常有力......我在整個S/O中發佈了許多其他問題。 – DRapp 2012-01-11 19:39:57

+0

是的,我將不得不閱讀mysql變量。 – 2012-01-11 21:02:40

0
  1. 打開LEFT JOININNER JOIN
  2. 你最好使用Memcached而不是MySQL緩存。