素材牛VIP会员
php如何设计或实现数据统计
 小***6  分类:SQL代码  人气:1017  回帖:9  发布于6年前 收藏

想实现数据的一些统计,比如用户多种积分,发帖数,评论数等等,版块的总帖数,总评论;数诸如类似。

举例: 用户发帖增长积分,更新发帖数统计,同样版块帖子统计变化,又或者还会有其他的统计变化。

针对这种情况是直接在需要的地方通过数据表count()统计还是在表中新增各个的统计字段,触发时候通过事务来完成呢?

我个人偏向于后面这种,但又觉得统计数据用事务来保证数据统计一致性又有点不合理??
但是话又说回来,不采用事务,有些地方又会因为统计错误造成一些错误,类似分页错误?

各位大神有什么好的思路或者建议呢?求指点!

 标签:redismysqlyii2php

讨论这个帖子(9)垃圾回帖将一律封号处理……

Lv2 入门
龙***c 技术总监 6年前#1

InnoDB的count需要实时扫描所有数据行,慢
Myisam的话应该不怎么用的
建议数据表添加统计字段

Lv5 码农
谁***哥 Web前端工程师 6年前#2

最好别用count,数据量大了之后数据库吃不消这种查询,尤其是这种对用户的查询。

Lv6 码匠
陈***丶 UI设计师 6年前#3

定时count然后放在缓存里面

Lv1 新人
编***魔 职业无 6年前#4

不是大神,我做的话会把这类的数据放redis里面。

Lv5 码农
迷***雾 软件测试工程师 6年前#5

统计用后端服务去处理.比如后端连一台slave.对你业务不影响

Lv6 码匠
雨***技 其它 6年前#6

【背景】
1 这个问题是由于数据库性能不能够满足现有业务场景产生的
2 按照你提供的业务场景,数据是允许有一定的误差的

【程序结构】

现有程序结构是从直接调用数据库进行操作的,但是数据库的性能无法满足要求,这时候我们不能单一依赖于数据库,因此我们需要在数据库之间添加一层【计数器】的东西

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

在程序调整前后,我们需要在数据库的【增】【删】【改】的三个环节添加【切面】即为afterSave事件,也可以理解为钩子,
对于【计数器】通常使用redis,因为可以持久化

【需要注意】
1 由于可能会出现db操作正常,但是redis操作失败,因此可能会出现数据的误差
2 由于可能有误差的情况,就需要一个纠错的机制,这个机制可以再服务器压力小的情况下,使用mysql的count或者sum进行更新
3 或者使用另外的【事物机制】来保证DB和Redis的操作原子性。

Lv2 入门
雨***3 页面重构设计 6年前#7
  1. 用Redis保存这些热数据,这里使用redis是作为缓存,做个主从同步,就不怕宕机数据丢失了

  2. 然后crontab定时任务跑个脚本,每天落地数据到Mysql保存

  3. 再用个Redis做持久化操作,跑定时任务把要统计的数据无论是评论还是积分,按天,按周,按月分别存储好。格式为都按照Json格式存储。

  4. 需要调用的时候,就从做了持久化的redis中读取数据,做数据分析或报表啥的,速度很快,基本不存在卡顿问题,或者搜索个东西等很久的现象,Json格式的数据,做一些操作后传给前端,用js遍历数据,随便分发到哪里的cdn服务器,完全动静分离不耦合。

Lv1 新人
青***8 页面重构设计 6年前#8

这个怎么讲吧 一般论坛都是采用加字段的,加字段有时候也会出现差错的,但是出现差错之后,我们都是可以在后台进行操作,重新统计的,就是再次更新各个总数的字段,当然,不管你是不是使用redis,最终都需要这个统计字段的,数据最终都是要进入数据库的。


Lv4 码徒
be***ai JS工程师 6年前#9

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

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取