在MySQL中快速插入和搜索的最佳解决方案。行?

时间:2015-05-29 10:03:47

标签: mysql performance hadoop

我们计划在我们的网络应用程序中实现一项功能,该功能将为用户提供搜索功能,并将DB(MySQL - INNODB)中所有匹配记录的ID保存为“列表”。结果可能是数百万。我们希望用户能够节省多达100万个ID。它必须是实时的(最多5-10秒延迟是可以接受的)。然后可以将此列表作为另一个过滤器与现有过滤器结合使用。

我们不需要从客户端传递这些ID,因为可以在服务器端进行相同的搜索以检索这些ID。但是,稍后可以重复使用相同的搜索来获取这些ID,因为搜索结果可能会发生变化。

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

服务器的RAM比完整数据库(几百GB)多。它还使用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:

  • 拥有一个包含用户ID,列表ID,文档ID
  • 的单独表格
  • 将ID保存在单独的行中(可能有1百万行用于1个列表)
  • 一定大小后的分区表

好处:此表可以在以后的JOIN条件中轻松使用,索引搜索性能应该很快。

问题:插入速度很慢 - 我知道有很多方法可以加快插入速度,但是一旦表格增长,它仍然可能需要超过几秒钟的时间。

解决方案2:

  • 将所有ID保存在一行
  • 使用MapReduce等技术快速搜索,以块的形式将这些ID作为IN参数传递给

好处:插入速度非常快。

问题:使用MapReduce可以快速搜索性能,但是如果许多用户开始进行此类搜索,它可能会给服务器带来很大的负担。

有关最佳方式的建议吗?是否还有其他可能的方法来满足这种情况?

1 个答案:

答案 0 :(得分:0)

将中间结果保存为渐进式过滤 - 我从未见过这样成功使用过。只需构建完整的查询并每次执行它。