我有一个表格,用于存储用户对帖子的反馈,类似这样的
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;
答案 0 :(得分:1)
SELECT COUNT响应时间会随着数据的增长而降低。我会选择第一个选项。但是,为此使用关系数据库可能是一种矫枉过正,也许你应该看看在后台持久存储到磁盘的内存缓存,以及类似的东西(redis,guava,memcache等)。
此外,如果这个数字不是"任务关键"你可以忍受不时失败的更新。
答案 1 :(得分:0)
它被去标准化,但我们已经看到更糟。这是常见做法,但容易出错。但是,如果要反馈的插入可以包含在事务中:反馈插入发生 AND ,Likes
的更新都会成功,否则事务将被回滚。
通过使用此Likes
列,可以大幅提升效果。它是一个瘦的数据类型大小,如果你将它与covered index
(复合)和post_id结合使用,那么对于post_id
,Likes
的查询,它在索引页面中完全可用而没有数据页后面的数据库引擎(更不用说不需要连接)。昨晚看到这个有数千万行的人得到了快速的输出。