搜尋

首頁  >  問答  >  主體

mysql - php如何設計或實作資料統計

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

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

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

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

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

过去多啦不再A梦过去多啦不再A梦2791 天前655

全部回覆(7)我來回復

  • 伊谢尔伦

    伊谢尔伦2017-05-16 12:04:55

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

    回覆
    0
  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-16 12:04:55

    定時count然後放在快取裡面

    回覆
    0
  • 大家讲道理

    大家讲道理2017-05-16 12:04:55

    不是大神,我做的話會把這類的資料放進redis裡面。

    回覆
    0
  • 为情所困

    为情所困2017-05-16 12:04:55

    【背景】
    1 這個問題是由於資料庫效能不能夠滿足現有業務場景產生的
    2 按照你提供的業務場景,數據是允許有一定的誤差的

    【程式結構】

    現有程式結構是從直接呼叫資料庫進行操作的,但是資料庫的效能無法滿足要求,這時候我們不能單一依賴資料庫,因此我們需要在資料庫之間添加一層【計數器】的東西

    之前
    [程序] -> [数据库]
    之后
    [程序] -> [数据库]
          -> [计数器]
          

    在程式調整前後,我們需要在資料庫的【增】【刪除】【改】的三個環節加上【切面】即為afterSave事件,也可以理解為鉤子,
    對於【計數器】通常使用redis,因為可以持久化

    【需要注意】
    1 由於可能會出現db操作正常,但是redis操作失敗,因此可能會出現資料的誤差
    2 由於可能有誤差的情況,就需要一個糾錯的機制,這個機制可以再伺服器壓力在小的情況下,使用mysql的count或sum進行更新
    3 或使用另外的【事物機制】來確保DB和Redis的操作原子性。

    回覆
    0
  • 怪我咯

    怪我咯2017-05-16 12:04:55

    InnoDB的count需要即時掃描所有資料行,慢
    Myisam的話應該不怎麼用的
    建議数据表添加统计字段

    回覆
    0
  • 黄舟

    黄舟2017-05-16 12:04:55

    統計用後端服務去處理.例如後端連一台slave.對你業務不影響

    回覆
    0
  • 阿神

    阿神2017-05-16 12:04:55

    第一個人不太建議使用count()形式作為資料累計,應該偏向累加的形式。
    因為每次新增資料時候,又要使用count()去統計,這樣很讓資料庫吃不消。
    所以建議這樣做:
    1.使用nosql保留所以統計數據
    2.在新增時候,觸發某個模組,將相應數據累加,並覆蓋原有數據。
    3.為了確保nosql出現down幾位問題,建議在資料庫中保存對應統計數據,並編寫一個邏輯模組,讓nosql數據定時保存到資料庫中。
    4.當然你可以定時使用count(這個可以留到伺服器閒時時候做),重新審核統計數據是否正確

    回覆
    0
  • 取消回覆