优化从非常大的MySQL表中提取数据的算法

时间:2012-12-19 17:42:22

标签: php mysql algorithm

我的网站提供了大量标记和分类的内容,我正在尝试创建一个强大的算法来根据用户需求排列内容。用户可以选择他们最感兴趣的标签,并且与这些标签匹配的内容将被赋予更高的优先级。此外,内容可以“喜欢”(优先推送),时间衰减优先推送内容。因此,最终,用户应该看到与他们感兴趣的内容相符的相对较新的内容,并且也受到其他用户的欢迎。

当前算法的工作方式如下:

  1. content表中提取所有项目。为每个项目分配1分。
  2. 针对content_tags检查user_tags以查看从步骤1中拉出的阵列中是否存在匹配项。如果是,请对该项目的分数应用乘数。
  3. 检查content_likes以查看每件商品有多少喜欢。根据此金额应用另一个乘数。
  4. 根据项目的时间衰减应用第三个因子。显然,较旧的物品比新物品受到更大的惩罚。
  5. 按总分排序。生成的数组应首先具有最相关的项。然后,我可以简单地将此数组修剪为20个左右的项目并在页面上显示它们。
  6. 正如您可能已经知道的那样,这是一个缓慢的算法,它不仅需要运行查询来提取每一段内容,而且还必须运行单独的查询来检查content_tagsuser_tagscontent_likes。查询太多了!

    我想我的第一个问题是:我做错了吗?除此之外,你能想出任何方法来优化我上面总结的一切吗?假设项目和用户具有相关标签,则算法本身运行良好。但我担心当我的content桌子增长到成千上万的时候,我会陷入一团糟。

    感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

使用许多查询会降低页面速度。 尝试将它们尽可能少地组合在一起,请使用mysql表上的索引!您会注意到创建索引肯定会对页面的加载时间产生影响。