想實現數據的一些統計,例如用戶多種積分,發文數,評論數等等,版塊的總帖數,總評論;數諸如類似。
舉例: 用戶發文增長積分,更新發文數統計,同樣版塊貼文統計變化,又或者還會有其他的統計變化。
針對這種情況是直接在需要的地方透過資料表count()統計還是在表中新增各個的統計字段,觸發時候透過事務來完成呢?
我個人偏向後面這種,但又覺得統計數據用事務來保證數據統計一致性又有點不合理? ?
但話又說回來,不採用事務,有些地方又會因為統計錯誤造成一些錯誤,類似分頁錯誤?
各位大神有什麼好的思路或建議呢?求指點點!
最好別用count,資料量大了之後資料庫吃不消這種查詢,尤其是這種對使用者的查詢。
定時count然後放在快取裡面
不是大神,我做的話會把這類的資料放進redis裡面。
【背景】
1 這個問題是由於資料庫效能不能夠滿足現有業務場景產生的
2 按照你提供的業務場景,數據是允許有一定的誤差的
【程式結構】
現有程式結構是從直接呼叫資料庫進行操作的,但是資料庫的效能無法滿足要求,這時候我們不能單一依賴資料庫,因此我們需要在資料庫之間添加一層【計數器】的東西
在程式調整前後,我們需要在資料庫的【增】【刪除】【改】的三個環節加上【切面】即為afterSave事件,也可以理解為鉤子,
對於【計數器】通常使用redis,因為可以持久化
【需要注意】
1 由於可能會出現db操作正常,但是redis操作失敗,因此可能會出現資料的誤差
2 由於可能有誤差的情況,就需要一個糾錯的機制,這個機制可以再伺服器壓力在小的情況下,使用mysql的count或sum進行更新
3 或使用另外的【事物機制】來確保DB和Redis的操作原子性。
InnoDB的count需要即時掃描所有資料行,慢
Myisam的話應該不怎麼用的
建議
数据表添加统计字段
統計用後端服務去處理.例如後端連一台slave.對你業務不影響
第一個人不太建議使用count()形式作為資料累計,應該偏向累加的形式。
因為每次新增資料時候,又要使用count()去統計,這樣很讓資料庫吃不消。
所以建議這樣做:
1.使用nosql保留所以統計數據
2.在新增時候,觸發某個模組,將相應數據累加,並覆蓋原有數據。
3.為了確保nosql出現down幾位問題,建議在資料庫中保存對應統計數據,並編寫一個邏輯模組,讓nosql數據定時保存到資料庫中。
4.當然你可以定時使用count(這個可以留到伺服器閒時時候做),重新審核統計數據是否正確