搜索

首页  >  问答  >  正文

mysql - php如何设计或实现数据统计

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

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

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

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

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

过去多啦不再A梦过去多啦不再A梦2756 天前632

全部回复(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
  • 取消回复