mysql - php如何設計或實作資料統計
过去多啦不再A梦
过去多啦不再A梦 2017-05-16 12:02:55
0
7
588

想實現數據的一些統計,例如用戶多種積分,發文數,評論數等等,版塊的總帖數,總評論;數諸如類似。

舉例: 用戶發文增長積分,更新發文數統計,同樣版塊貼文統計變化,又或者還會有其他的統計變化。

針對這種情況是直接在需要的地方透過資料表count()統計還是在表中新增各個的統計字段,觸發時候透過事務來完成呢?

我個人偏向後面這種,但又覺得統計數據用事務來保證數據統計一致性又有點不合理? ?
但話又說回來,不採用事務,有些地方又會因為統計錯誤造成一些錯誤,類似分頁錯誤?

各位大神有什麼好的思路或建議呢?求指點點!

过去多啦不再A梦
过去多啦不再A梦

全部回覆(7)
伊谢尔伦

最好別用count,資料量大了之後資料庫吃不消這種查詢,尤其是這種對使用者的查詢。

过去多啦不再A梦

定時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(這個可以留到伺服器閒時時候做),重新審核統計數據是否正確

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!