【发布时间】:2015-05-29 10:03:47
【问题描述】:
我们计划在我们的 Web 应用程序中实现一项功能,该功能将使用户能够进行搜索并将所有匹配记录的 ID 保存在数据库 (MySQL - INNODB) 中作为“列表”。结果可能以百万计。我们希望用户能够保存多达 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)
这似乎是一些可能的解决方案:
解决方案一:
- 有一个单独的表,其中包含用户 ID、列表 ID、文档 ID
- 将 ID 保存在单独的行中(1 个列表可能有 100 万行)
- 一定大小后的分区表
优点:这个表可以很容易地在以后的 JOIN 条件中使用,并且带有索引的搜索性能应该很快。
问题:插入会很慢 - 我知道有一些方法可以加快插入速度,但它仍然可能需要超过几秒的时间,尤其是在表格增长时。
解决方案 2:
- 将所有 ID 保存在一行中
- 使用 MapReduce 等技术将这些 ID 作为 IN 参数分块传递给查询,以实现快速搜索
好处:插入会很快。
问题:使用 MapReduce 可以提高搜索性能,但它会给服务器带来大量负载,尤其是当许多用户开始进行此类搜索时。
关于什么是最好的方法有什么建议吗?有没有其他可能的方法来满足这种情况?
【问题讨论】:
-
如果有人能对此发表评论,我们将不胜感激。
-
必须使用 MySQL 吗?因为你可以使用 mongodb 来提高你的读/写性能。
-
它是一个已经在 MySQL 中的大型应用程序,因此不能因为这个特性而仅仅转移到 Mongodb。
标签: mysql performance hadoop