【问题标题】:MySQL counting record vs storing a counterMySQL计数记录与存储计数器
【发布时间】:2015-06-07 00:27:46
【问题描述】:

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

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;

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    SELECT COUNT 响应时间会随着数据的增长而缩短。我会选择第一个选项。但是,为此使用关系数据库可能有点过头了,也许您应该查看在后台持久保存到磁盘的内存缓存以及类似的东西(redis、guava、memcache 等)。

    此外,如果这个数字不是“关键任务”,您可能会遇到更新不时失败的情况。

    【讨论】:

      【解决方案2】:

      它是非规范化的,但我们看到的情况更糟。这是常见的做法,但容易出错。但是,如果对反馈的插入可以包装在事务中:反馈插入发生Likes 的更新都成功,否则事务将回滚。

      拥有此Likes 列可以显着提高性能。它是一个精简的数据类型大小,如果将它与 post_id 组合在 covered index(复合)中,那么在查询 post_id,Likes 时,它在索引页面中完全可用,无需数据库引擎跟踪数据页面(更不用说不需要加入)。昨晚看到有人拥有数千万行的快速输出。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-04
        • 2020-11-19
        • 2011-02-09
        • 1970-01-01
        • 1970-01-01
        • 2015-05-15
        • 1970-01-01
        • 2014-12-19
        相关资源
        最近更新 更多