如何使用 PHP/MySQL 应用排名算法?
How to apply a ranking algorithm using PHP/MySQL?
我正在研究一种算法,可以为网站上发布的某些消息打分。该分数将用于对所有消息进行排名。如果一条消息的分数很高,则该消息将排在其他消息(具有较低分数)之上,反之亦然。该算法的参数是 upvotes/downvotes 的数量和自发布消息以来经过的秒数。
我想使用 PHP 和 MySQL 在网页上显示数百万条消息。当然我会使用寻呼系统。由于该算法的参数之一是消息发布后经过的秒数,因此该分数会随时间变化。但我需要更新它。我更新每条消息分数的唯一方法是在客户端要求显示消息时使用 PHP 自动更新它,然后用 MySQL 请求调用它们: SELECT * FROM messages ORDER BY score
.
但是因为有数百万条消息,每次有人想看一些消息时更新所有内容会花费很多时间。
如何在 PHP 中实现它?
所以基本上,我问的是如何对消息进行排名(使用分数),而不必在调用它们之前计算每条消息的分数(因为这会花费很多时间)+因为我要使用分页系统时,一次只能从数据库中选择 20 或 30 条消息。
非常感谢
实时更新会很困难,而且在性能方面代价高昂。但我有建议 - 您可以使用 MySQL 事件调度程序定期安排作业,可能每半小时一次,具体取决于数据库大小。 运行 定期将批处理脚本作为 cron 作业也可以工作,但在 MySQL 中直接执行事件是更好的选择。
由于排名是根据 post 的年龄和投票数计算的,因此存储过程将起作用。
其他解决方案,我推荐 - 运行 更新查询以计算结果集的排名,作为以分页形式显示的数据。
创建一个字段,其中包含自 1970 年创建 post 以来的毫秒数。然后使用以下内容:
select milisecondsSince1970 as t,votes as v,* from messages order by (v-a*(t-t0))
其中:
- "a" 是您赋予 "t" 所需权重的个人因素。
- t0 是从您认为的确切日期算起的 miliseocnds
开始日期而不是 1970 年。
由于评分标准是"time",此解决方案仅适用于您的问题。在其他大量计算中,建议定期更新分数。
我正在研究一种算法,可以为网站上发布的某些消息打分。该分数将用于对所有消息进行排名。如果一条消息的分数很高,则该消息将排在其他消息(具有较低分数)之上,反之亦然。该算法的参数是 upvotes/downvotes 的数量和自发布消息以来经过的秒数。
我想使用 PHP 和 MySQL 在网页上显示数百万条消息。当然我会使用寻呼系统。由于该算法的参数之一是消息发布后经过的秒数,因此该分数会随时间变化。但我需要更新它。我更新每条消息分数的唯一方法是在客户端要求显示消息时使用 PHP 自动更新它,然后用 MySQL 请求调用它们: SELECT * FROM messages ORDER BY score
.
但是因为有数百万条消息,每次有人想看一些消息时更新所有内容会花费很多时间。
如何在 PHP 中实现它?
所以基本上,我问的是如何对消息进行排名(使用分数),而不必在调用它们之前计算每条消息的分数(因为这会花费很多时间)+因为我要使用分页系统时,一次只能从数据库中选择 20 或 30 条消息。
非常感谢
实时更新会很困难,而且在性能方面代价高昂。但我有建议 - 您可以使用 MySQL 事件调度程序定期安排作业,可能每半小时一次,具体取决于数据库大小。 运行 定期将批处理脚本作为 cron 作业也可以工作,但在 MySQL 中直接执行事件是更好的选择。 由于排名是根据 post 的年龄和投票数计算的,因此存储过程将起作用。
其他解决方案,我推荐 - 运行 更新查询以计算结果集的排名,作为以分页形式显示的数据。
创建一个字段,其中包含自 1970 年创建 post 以来的毫秒数。然后使用以下内容:
select milisecondsSince1970 as t,votes as v,* from messages order by (v-a*(t-t0))
其中:
- "a" 是您赋予 "t" 所需权重的个人因素。
- t0 是从您认为的确切日期算起的 miliseocnds 开始日期而不是 1970 年。
由于评分标准是"time",此解决方案仅适用于您的问题。在其他大量计算中,建议定期更新分数。