【问题标题】:Most efficient way to calculate 'popularity' of objects on website计算网站上对象“受欢迎程度”的最有效方法
【发布时间】:2011-02-23 14:48:14
【问题描述】:

好的,所以我正在建立一个人们可以发布新闻、cmets、问题等的网站。人们还可以评价所有这些对象,最喜欢它们,分享它们等。该网站是 PHP+MySQL。我用 PHP 编写了一个脚本,它执行以下操作:

  1. 获取所有 cmets 以及过去 5 分钟内添加到它们的分数。在“流行度”表中添加一条记录,其中包含每个评论对象的流行度变化。
  2. 获取添加到其中的所有新闻和分数/视图/收藏夹/分享。计算每个新闻故事的流行度(考虑到第 1 步中附加到它们的 cmets 的流行度变化),并在流行度表中插入一条记录,其中包含每个新闻对象的流行度变化。
  3. 对问题和其他对象类型重复第 2 步

我尝试使用 cron 作业每 5 分钟运行一次这个脚本(它实际上是一个 symfony 任务),然后 PHP 开始阻塞并占用我所有的服务器资源。

运行后台分析脚本(根据 MySQL 数据库中的数据计算新数据,然后将计算出的数据插入数据库)的首选方法是什么?我确定我在这里遗漏了一些基本程序。我应该注意到数据库位于不同的服务器上,并且该服务器没有资源问题。问题似乎仅限于 PHP 在应用服务器上循环遍历对象、计算流行度(简单计算)和插入 DB 时阻塞。

谢谢

-- 编辑

如何将数据库复制到仅用于计算的服务器。我可以使用复制的数据库在计算服务器上运行流行度脚本,并将计算的流行度记录插入到实时数据库中。它当然会稍微延迟,但这并不是什么大不了的事。我不确定这是否会解决 PHP 资源消耗问题。

【问题讨论】:

    标签: php mysql performance reporting


    【解决方案1】:

    首先要做的是尝试减少您执行的查询数量。如果您的 sql 和 web 服务器位于不同的机器上,这一点尤其重要。尝试使用 JOIN 来计算新闻项的流行度,而不是单独通过所有 cmets。

    您可以在同一个查询中计算 cmets 的流行度和新项目的流行度。 (例如 select sum(rating) FROM news, cmets, rating WHERE cmets.news_id = news.id AND rating.comment_id = cmets.id (这个查询过于简单但仍然......)因为你的主要问题是查询的数量您必须执行,并且您的 mysql 服务器上肯定会有足够的资源。因为大多数时候 sql server 只会等待下一个查询到达。跨网络的通信比 cpu 和 ram 之间的通信慢了无数倍。基本上发生的情况是:php 向 mysql 服务器发送查询并等待响应。 Mysql 获取一个查询进程,发送响应并等待下一个查询。这种等待是需要时间的......所以要么减少查询量,要么使用mysqli http://php.net/manual/en/mysqli.multi-query.php同时发送所有查询

    【讨论】:

    • 好的,所以我最初打算仅根据用户对对象本身的评分来确定对象的流行度。从那以后,我决定尝试根据一系列因素计算对象的流行度(通过上述方法),其中一个是连接到一个对象的所有 cmets 的流行度。所以首先我需要计算 cmets 的热度,然后根据新闻分数变化、浏览量变化、评论热度变化等来计算新闻的热度。
    • 我在回答中添加了更多信息
    • Ivan,多查询修复了一切!现在快多了。谢谢!
    【解决方案2】:

    如果数据库在不同的服务器上,我宁愿选择编写 MySQL 程序来计算,或者至少使用持久连接。无论如何,5 分钟是非常常见的,尤其是对于繁忙的服务器。 在我看来,通常这样的任务应该每天执行一次到几次。

    【讨论】:

    • 我在数据库服务器上的资源消耗实际上并没有太大的峰值。仅在应用程序服务器及其上的 PHP 进程上。如此频繁地计算它的原因是因为我根据受欢迎程度对对象进行排序,并且用户可以看到接近实时的受欢迎程度。
    • 我明白,请确保您只计算“脏”对象。第二件事你可以选择以小块计算它并在你停止的地方写入索引。
    【解决方案3】:

    您可以在每次执行会改变它的操作时更新流行度,而不是将其作为 cron 作业运行。因此,例如,当用户添加评论或评价某个项目时,一旦完成,您就会更新该项目的受欢迎程度。

    【讨论】:

      猜你喜欢
      • 2017-01-04
      • 1970-01-01
      • 2019-03-12
      • 2021-02-20
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      相关资源
      最近更新 更多