随机排序的多个搜索的性能

时间:2012-02-28 19:18:24

标签: php mysql apache

我正处于网站的设计阶段,我有一个功能的解决方案,但我不知道当网站有希望增长时它是否会是一个好的解决方案。我希望用户能够对其他用户执行搜索,并且必须订购他们找到的结果:首先是“聚光灯”用户,然后是所有其他用户。结果必须随机排序,尊重前面提到的顺序和分页。

我想到的解决方案之一是将查询结果存储在服务器端的会话变量中。为了提高性能,当用户离开搜索时,该变量将被销毁。

当网站有数千名用户并且每天都会进行数千次搜索时会发生什么?我的解决方案是可行的还是服务器会超载?

我有更多的解决方案,就像一个中间表,其中按照上述顺序转储n次用户。这样就不需要在用户的会话中创建一个大数组,并且通过针对数据库的多个查询来完成分页。

虽然我很感激任何我特别感兴趣的建议,听取过渡网站经验丰富的开发者的意见。

(采用的技术是LAMP,InnoDb表)

3 个答案:

答案 0 :(得分:2)

这绝对不是你要找的答案,但我必须说出来。 Premature Optimization is the root of all evil

通过该查询的简单实现获取该网站,然后回来询问是否是最糟糕的瓶颈。

答案 1 :(得分:2)

过早优化很糟糕。但是你应该提前计划。你不需要实现它。但要做好准备。

如果每天都有成千上万的用户搜索此查询,那么在会话中缓存查询结果并不是一个好主意。导致某些用户可以缓存相同的结果,而其他用户则需要执行该结果。对于这种情况,我建议您将搜索结果保存在用户独立的数据结构(文件,内存等)中。

  1. 对于每个搜索查询,将结果,创建日期,上次访问日期保存在磁盘或内存中。
  2. 如果任何用户搜索同一查询,则显示缓存中的结果
  3. 运行一段时间后使缓存无效的cron。
  4. 这样,频繁搜索将在大部分时间内及时提供。它还减少了数据库的负担。

答案 2 :(得分:0)

我假设您希望通过缓存搜索结果来减少对数据库的命中,以便搜索同一组因子的其他用户不必再次访问数据库 - 尤其是非非常松散的查询字符串索引字段。如果是这样,您就无法将其存储在会话中 - 这仅适用于单个用户。

我使用像Cache_Lite这样的缓存层,并根据查询字符串(不是sql查询,而是来自站点的搜索参数)从db查询缓存结果集。这样就可以缓存相同的搜索。在PHP中处理数组的排序和分页,而不是在DB中。