我们计划在我们的 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)
这似乎是一些可能的解决方案:
解决方案一:
- 有一个包含 User Id、List Id、Doc Id 的单独表
- 将 ID 保存在单独的行中(1 个列表可能有 100 万行)
- 一定大小后的分区表
好处:此表以后可以很容易地在 JOIN 条件中使用,并且索引搜索性能应该很快。
问题:插入会很慢 - 我知道有一些方法可以加快插入速度,但它仍然需要比几秒更长的时间,尤其是在表增长时。
解决方案 2:
- 将所有 ID 保存在一行中
- 使用 MapReduce 等技术将这些 ID 作为查询中的 IN 参数分块传递以进行快速搜索
好处:插入会非常快。
问题:使用 MapReduce 可以提高搜索性能,但它会给服务器带来大量负载,尤其是当许多用户开始进行此类搜索时。
关于什么是最好的方法有什么建议吗?是否有任何其他可能的方法来满足这种情况?
最佳答案
在渐进式过滤中保存中间结果——我从未见过它被成功使用过。只需构建完整的查询并每次都执行它。
关于mysql - 在 MySQL 中快速插入和搜索大号的最佳解决方案。行数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30526744/