讓我舉一個我的問題的例子。假設我有一個名爲的用戶和一個名爲付款的表。要計算用戶的總餘額,我會使用查詢來獲取特定日期後的所有付款,然後將結果緩存一段時間。緩存大型SQL查詢 - 構建的最佳方式?
但是,我想知道,由於這種性質,在用戶表中有一個名爲balance
的列,然後當緩存過期時,我使用不同的查詢來收集付款,但是從較短的時間,然後將這個數量加到balance
列中的任何內容上?
讓我舉一個我的問題的例子。假設我有一個名爲的用戶和一個名爲付款的表。要計算用戶的總餘額,我會使用查詢來獲取特定日期後的所有付款,然後將結果緩存一段時間。緩存大型SQL查詢 - 構建的最佳方式?
但是,我想知道,由於這種性質,在用戶表中有一個名爲balance
的列,然後當緩存過期時,我使用不同的查詢來收集付款,但是從較短的時間,然後將這個數量加到balance
列中的任何內容上?
因此,任何模型,更新總餘額
一般每當新的付款被保存。這樣,你能保證你的數據庫和你的數據將始終保持同步
預先計算可以是一個MySQL觸發器或類似的Gearman
但是作爲你自己的問題後臺任務建議如果你想做一些增加的餘額彙總,我會建議去幾個月或某個固定的日期範圍。如果付款可能在過去的一個月出現,那麼這將起作用,因爲您沒有支付回款或類似的東西。
開始新月份,運行支付聚合器,bam,您現在只需要對每月表格進行求和。
這一切都取決於你需要處理多少數據。但是我再次強調,數據一致性比速度更有價值,你可以隨時購買更多的服務器。
要計算用戶的總餘額,
您可以創建總是包含用戶當前餘額的附加表。如果爲用戶添加了新的付款,則該列也需要更新。進行交易,以便添加付款並更新總餘額。
如果您需要更加區分的用戶關係,可以在用戶關係旁邊保留一個日期列,以表示您需要進行計算的時間間隔。例如。過去一週的回覆數字或月份數字。
如果您需要更多的靈活性,您可以在一段時間後將現有付款壓縮到總價值中,並將其存儲到與用戶相關並保留日期列的此類餘額表中。
然後,您可以將尚未壓縮/壓縮日期的「實時」付款表與UNION結合起來。然後使用聚合函數來總和總餘額。如果您需要保留最近的數據以獲得更詳細的信息,您可以在一段時間後離開數據存儲區,只保留統計值,這可能會爲您提供兩全其美的解決方案。
「*它會是一個好主意*」 - 取決於您的應用程序。你多久更新一次餘額?您需要多久取一次?你使用什麼不同的查詢來完成後者(MySQL會自動緩存查詢結果,只要發出相同的查詢,這是非常有用的)? – eggyal
每次付款時都會更新餘額,但用戶的更改可能會延遲(緩存幾分鐘或某事)。查詢本身會根據每個用戶而改變,並且結果會非常頻繁地改變(基於付款次數)。以及另一個因素;支付時間。 – Prash
我通常有列'something_cache'和函數來完全重新生成它們。我不認爲一個函數能夠正確地重新生成它們*只有大部分時間*不是很好。但正如eggyal所說,這實際上取決於您的應用程序。 – AndreKR