2013-01-03 43 views
1

讓我舉一個我的問題的例子。假設我有一個名爲的用戶和一個名爲付款的表。要計算用戶的總餘額,我會使用查詢來獲取特定日期後的所有付款,然後將結果緩存一段時間。緩存大型SQL查詢 - 構建的最佳方式?

但是,我想知道,由於這種性質,在用戶表中有一個名爲balance的列,然後當緩存過期時,我使用不同的查詢來收集付款,但是從較短的時間,然後將這個數量加到balance列中的任何內容上?

+0

「*它會是一個好主意*」 - 取決於您的應用程序。你多久更新一次餘額?您需要多久取一次?你使用什麼不同的查詢來完成後者(MySQL會自動緩存查詢結果,只要發出相同的查詢,這是非常有用的)? – eggyal

+0

每次付款時都會更新餘額,但用戶的更改可能會延遲(緩存幾分鐘或某事)。查詢本身會根據每個用戶而改變,並且結果會非常頻繁地改變(基於付款次數)。以及另一個因素;支付時間。 – Prash

+0

我通常有列'something_cache'和函數來完全重新生成它們。我不認爲一個函數能夠正確地重新生成它們*只有大部分時間*不是很好。但正如eggyal所說,這實際上取決於您的應用程序。 – AndreKR

回答

2
這些類型的「預先計算」的價值觀我覺得最痛苦中解脫的方式是存儲/更新他們保存的是涉及數據

總之

因此,任何模型,更新總餘額

一般每當新的付款被保存。這樣,你能保證你的數據庫和你的數據將始終保持同步

預先計算可以是一個MySQL觸發器或類似的Gearman


但是作爲你自己的問題後臺任務建議如果你想做一些增加的餘額彙總,我會建議去幾個月或某個固定的日期範圍。如果付款可能在過去的一個月出現,那麼這將起作用,因爲您沒有支付回款或類似的東西。

開始新月份,運行支付聚合器,bam,您現在只需要對每月表格進行求和。

這一切都取決於你需要處理多少數據。但是我再次強調,數據一致性比速度更有價值,你可以隨時購買更多的服務器。

+0

是的 - 你的最後一點,這就是爲什麼我有一個靜態的「平衡」列猶豫不決。 – Prash

+0

您是否期望太多的數據在查詢中聚合? (說更新,甚至後臺任務?) –

+0

沒有太多的數據。你會考慮哪些數據太多? – Prash

3

要計算用戶的總餘額,

您可以創建總是包含用戶當前餘額的附加表。如果爲用戶添加了新的付款,則該列也需要更新。進行交易,以便添加付款並更新總餘額。

如果您需要更加區分的用戶關係,可以在用戶關係旁邊保留一個日期列,以表示您需要進行計算的時間間隔。例如。過去一週的回覆數字或月份數字。

如果您需要更多的靈活性,您可以在一段時間後將現有付款壓縮到總價值中,並將其存儲到與用戶相關並保留日期列的此類餘額表中。

然後,您可以將尚未壓縮/壓縮日期的「實時」付款表與UNION結合起來。然後使用聚合函數來總和總餘額。如果您需要保留最近的數據以獲得更詳細的信息,您可以在一段時間後離開數據存儲區,只保留統計值,這可能會爲您提供兩全其美的解決方案。

+0

我看到。因此,不是每次都要計算餘額,我只能從餘額欄中讀取餘額。這有效,但如果你理解我的意思,它對我來說似乎並不是很「動態」。 – Prash

+0

@Prash:不,但我擴展了兩個分支的答案,你可以從這個基本思想中進入,這兩個分支都增加了更多的動態性。 – hakre

+0

順便說一句,是第一個想要說列或表? – Prash