MySQL计数记录与存储计数器

时间:2015-06-07 00:27:46

标签: php mysql

我有一个表格,用于存储用户对帖子的反馈,类似这样的

Table: user_feedback. Feedback_id is PRI AI
Feedback_id     Post_id     User_id
1                  1          1     
2                  2          1
3                  1          3
4                  1          4
5                  5          1

在我的帖子表格中,我目前有类似的内容:

Table: posts
Post_id   Likes
1           3
2           1
5           1

每次收到帖子时我会增加喜欢的计数器,然后在我刚刚运行的时候获得喜欢帖子的数量

SELECT likes FROM posts WHERE post_id = 1;

但这是值得的吗(例如,存储反馈和MySQL以某种方式无法增加计数器)维护它,它甚至更快?那么快多快:

SELECT COUNT(feedback_id) FROM user_feedback WHERE post_id = 1;

2 个答案:

答案 0 :(得分:1)

SELECT COUNT响应时间会随着数据的增长而降低。我会选择第一个选项。但是,为此使用关系数据库可能是一种矫枉过正,也许你应该看看在后台持久存储到磁盘的内存缓存,以及类似的东西(redis,guava,memcache等)。

此外,如果这个数字不是"任务关键"你可以忍受不时失败的更新。

答案 1 :(得分:0)

它被去标准化,但我们已经看到更糟。这是常见做法,但容易出错。但是,如果要反馈的插入可以包含在事务中:反馈插入发生 AND Likes的更新都会成功,否则事务将被回滚。

通过使用此Likes列,可以大幅提升效果。它是一个瘦的数据类型大小,如果你将它与covered index(复合)和post_id结合使用,那么对于post_idLikes的查询,它在索引页面中完全可用而没有数据页后面的数据库引擎(更不用说不需要连接)。昨晚看到这个有数千万行的人得到了快速的输出。