【问题标题】:Looking for recommended methods for storing/cacheing counts [closed]寻找存储/缓存计数的推荐方法[关闭]
【发布时间】:2012-01-25 23:54:50
【问题描述】:

我正在使用 php/mysql 建立一个网站,其中会有帖子和评论。

帖子需要显示他们拥有的 cmets 数量。我在 Posts 表中有 count_comments 列,并在每次创建或删除评论时更新它。

最近有人建议我以这种方式去规范化是一个坏主意,我应该改用缓存。

【问题讨论】:

  • post和comment表之间有表关系吗?
  • 不同的人担心不同的事情。如果您是编程新手,那么您应该专注于学习和让事情顺利进行,而不是花絮。当我开始构建时,我使用 MySQL 做所有事情,并且慢慢地越来越多地转向缓存。
  • 对于关键数据不是一个好主意,因为除非您非常小心,否则它可能会不同步。在您的情况下,它将节省一些查询时间,如果有 80 cmets 但它说 81 - 不是世界末日。你的权衡。每隔一段时间,您就可以运行一个纠正任何错误计数的流程。

标签: php mysql caching architecture


【解决方案1】:

我的看法是:你在做正确的事。原因如下:

将字段 count_cmets 视为 数据模型的一部分 - 这很容易证明,您可以删除该字段的所有内容并且重新创建它很简单.

而是将其视为缓存,其存储只是与帖子位于同一位置 - 非常聪明,因为您可以在需要时免费获得它查询帖子

【讨论】:

  • 我的感觉完全一样。
【解决方案2】:

我不认为这是一个坏方法。

我确实认识到,随着代码库的扩展通过采用更严格的方法,它很容易引入副作用。好的部分是在某些时候必须计算或跟踪数据库中的行数,实际上没有办法摆脱这种情况。

我不建议这样做。还有其他获取评论计数的解决方案。查看Which is fastest? SELECT SQL_CALC_FOUND_ROWS FROM `table`, or SELECT COUNT(*)

该解决方案在选择时速度较慢,但​​需要更少的代码来跟踪评论数。


我会说您的方法避免了 LIMIT DE 优化,这是一个优点。

【讨论】:

    【解决方案3】:

    这是一个几乎从不需要的优化,原因有两个:

    1) 正确的索引将使简单的计数变得非常快。确保您的comments.post_id 列有索引。

    2) 当您需要缓存此值时,您将需要缓存更多。 如果您的网站有如此多的帖子、cmets、用户和流量,您需要缓存 cmets总而言之,那么您几乎肯定需要对大部分数据/输出使用缓存策略(将构建的页面保存到静态、memcache 等)。毫无疑问,这些策略将涵盖您的 cmets 总数,从而使表格字段变得毫无意义。

    【讨论】:

    • 对我来说最好测量这些速度,但我没有要测量的数据,所以我想我可以知道有一天网站是否会变大。
    【解决方案4】:

    我不知道“缓存”是什么意思,我会对我必须提供的其他答案感兴趣:

    从您的数据库中删除冗余信息很重要,并且以“相信者的方式”(意味着我没有真正测试它,它只是推测),我认为从您的数据库中使用 SUM() 函数是一种更好的方法去争取。 假设你所有的 cmets 都有一个 post_id,你所需要的只是:

    SELECT SUM(id) FROM comments WHERE id = {post_id_variation_here}
    

    这样,您可以减少 1 个常量 CRUD,以读取有多少 cmets 并提高性能。

    【讨论】:

      【解决方案5】:

      除非您的应用程序每秒没有数百或数千次点击,否则使用这样的 SQL 语句没有任何问题:

      select posts_field1, ..., (select count(*) from comments where comments_parent = posts_id) as commentNumber from posts
      

      无论如何,您都可以缓存页面的 html 输出。比根本不需要进行数据库查询。

      【讨论】:

        【解决方案6】:

        也许你可以将 post 和 comment 表相互连接,并使用 mysql 函数计算 mysql 中的 cmets 行:mysql_num_rows。像这样:

        发布表格

        postid*
        postcontent
        

        评论表

        commentid
        postid*
        comment
        

        然后统计mysql中的cmets如:

        $link = mysql_connect("localhost", "mysql_user", "mysql_password"); 
        mysql_select_db("database", $link);
        
        $result = mysql_query("SELECT * FROM commenttable WHERE postid = '1'", $link); 
        $num_rows = mysql_num_rows($result);
        

        【讨论】:

          猜你喜欢
          • 2012-07-10
          • 1970-01-01
          • 2011-07-01
          • 2010-10-09
          • 1970-01-01
          • 1970-01-01
          • 2013-01-12
          • 1970-01-01
          相关资源
          最近更新 更多