0

我有以下情况,其中搜索返回用户 ID 值列表(1、2、3、4、5、6 等)。如果要再次运行搜索,则保证在一段时间内结果会发生变化. 但是我需要存储搜索结果的实例以供将来使用。

我们有一个当前的实现(旧版),它使用条件为 search_id 创建一条记录,并将返回的每一行插入到具有关联 search_id 的不同表中。

table search_results
   search_id unsigned int FK, PK (clustered index)
   user_id unsigned int FK

这是一种不可接受的方法,因为该表已经增长到数百万条记录。我考虑过对表进行分区,但要么我会有很多分区(1000s)。

我已经优化了搜索结果过期的现有表,除非它们在其他地方使用,因此所有搜索结果都在其他地方引用。

在当前模式中,我无法将结果存储为序列化数组或 XML。我希望有效地存储搜索结果信息,以便以后可以有效地访问它而不受记录数量的影响。

编辑:谢谢您的回答,我自己运行搜索没有任何问题,但是在这种情况下,搜索的结果集被用于收件人列表,它将被一遍又一遍地使用,存储的目的是正是为了在给定时间获得数据的快照。

4

2 回答 2

2

答案是不存储查询结果。这是一个可怕的主意!

  • 它引入了有状态,除非你真的真的)需要它,否则这很糟糕。
  • 它不可扩展(正如您所发现的)
  • 数据一经存储就过时了

正确的方法是修复您的查询/数据库,以便它可以快速运行。

如果您不能使用更好的 SQL 和/或索引等使查询更快,我建议使用 lucene(或任何基于文本的搜索引擎)并将您的数据库非规范化到其中。Lucene 查询速度非常快。


我最近在一个正在做你正在做的事情的大型网站上做到了这一点:它在会话对象中缓存来自生产关系数据库的查询结果,以尝试加快查询速度,但它一团糟,而且不是无论如何都快得多 - 在我之前,一位实际上是个白痴的“高级”Java 开发人员(他的名字以 Jam.. 开头,以 .illiams 结尾)认为这是一个好主意。

我安装了 Solr(一个为 java 定制的 lucene 实现)并让 Solr 与关系数据库保持同步(使用工作队列),现在 Web 查询只需几毫秒。

于 2012-10-27T20:08:51.103 回答
0

是否有理由需要存储每次搜索?您肯定想要为用户提供最新的信息吗?

我首先承认,这不是一个很好的解决方案。

  • 在当前数据库旁边设置另一个数据库 [SYS_Searches]
  • 保存脚本可以使用 SELECT INTO [SYS_Searches].Results_{Search_ID}
  • 检索的脚本可以从匹配表中执行简单的 SELECT。

好处:

  • 每个搜索都整齐地打包到它自己的表中,[最好在另一个数据库中]
  • 检索查询很简单
  • 检索时间应该很快,没有大量的表扫描。

缺点:

  • 对于用户可以存储的每个 x 用户 * y 搜索,您将拥有一个表。

除非涉及使结果过期的管理或用户只能拥有 1 个缓存的搜索结果集,否则这可能会很快变得非常愚蠢。

不漂亮,但我想不出别的办法。

于 2012-10-27T19:25:32.037 回答