我们计划在我们的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的搜索性能可能会很快,但它可以在服务器上承受很多负载,特别是如果许多用户开始执行此类搜索。
任何建议是什么将是最好的方式?有没有其他可能的方法来迎合这种情况?
如果有人能对此发表评论,我们将非常感激。 –
http://stackoverflow.com/questions/2194914/why-is-mysql-innodb-so-much-slower-at-full-table-scans-than-myisam – Annabelle
是否强制使用MySQL?,因为你可以使用mongodb来增加你的读/写性能。 –