2015-05-29 61 views
1

我们计划在我们的Web应用程序中实现一项功能,该功能将为用户提供搜索功能,并将所有匹配记录的ID作为“列表”保存在DB(MySQL - INNODB)中。结果可能是数百万。我们希望用户能够保存多达1百万个ID。它必须是实时的(最大5-10秒延迟是可以接受的)。此列表可以稍后用作另一个与现有过滤器结合使用的过滤器。在MySQL中用于大型号的快速插入和搜索的最佳解决方案。行?

我们不需要从客户端传递这些ID,因为可以在服务器端完成相同的搜索以检索这些ID。但是,稍后在相同搜索中,搜索结果可能会发生变化,因此无法重新使用这些ID。

我们有几千个活跃用户,并不期望很多人创建这样的大列表,但随着时间的推移总数没有。保存在这些列表中的ID可以增长到数亿。

服务器比完整数据库(几百GB)有更多的RAM。它也使用SSD。

这里有问题,我们需要解决:

- Saving up to 1 million ids in DB (within few secs) 
- Using these IDs as a search criteria with other filters (this additional criteria shouldn't slow down the searches by more than few secs) 

这似乎是一些可能的解决方案:

解决方案1:

  • 有一个单独的表用户标识,列表标识,文档标识
  • 将标识保存在单独的行中(1列表可能为100万行)
  • 特定大小后的分区表

好处:此表可以很容易地在JOIN条件中使用,并且索引搜索性能应该很快。

问题:插入会很慢 - 我知道有办法加速插入,但仍然可能需要比几秒更长的时间,特别是一旦表增长。

解决方案2:

  • 全部保存在一排
  • 编号传送这些ID在参数查询中使用类似的MapReduce技术大块快速搜索

优点:的插入会相当快。

问题:使用MapReduce的搜索性能可能会很快,但它可以在服务器上承受很多负载,特别是如果许多用户开始执行此类搜索。

任何建议是什么将是最好的方式?有没有其他可能的方法来迎合这种情况?

+0

如果有人能对此发表评论,我们将非常感激。 –

+0

http://stackoverflow.com/questions/2194914/why-is-mysql-innodb-so-much-slower-at-full-table-scans-than-myisam – Annabelle

+0

是否强制使用MySQL?,因为你可以使用mongodb来增加你的读/写性能。 –

回答

0

保存渐进式过滤的中间结果 - 我从来没有见过这种成功的使用。只需构建完整的查询并每次执行一次。

相关问题