我们在3个分片中分发了2700万个文档,每个分片包含大约900万个文档。每个文档都有~15个索引字段。要求是我们应该能够使用索引字段的组合来过滤这些文档。对于复杂查询,count()最多需要不到20秒。
我们还需要使用find()提取与过滤器匹配的那些文档的特定字段。但是,有时这需要几分钟才能完成,特别是如果结果超过100万个文档。这是通过Web服务调用执行的,因此有时会发生超时。
我想知道添加更多分片是否可以解决问题,还是我们可以应用其他优化。
谢谢!
答案 0 :(得分:2)
添加更多分片不会对您有所帮助,但您可以进行分页,这可以返回有限的文档,因为您必须进行多个API调用
你可以这样做
db.users.find(/*condition*/).limit (10000)
db.users.find(/*condition*/).skip(10000).limit(10000)
db.users.find(/*condition*/).skip(20000).limit(10000)
答案 1 :(得分:0)
我在一个包含数千万条记录、过滤查询复杂的项目中遇到了同样的问题。
我不知道您是否有足够的资源或者您的项目是否可行,但我解决了该项目正在创建包含报告结果的新集合的问题。
系统在空闲时间提供和更新报告,大多数报告都可以使用或只需要为新字段更新。
正如其他人所说,分页对于这种查询是必须的。
如果您解决了有关查询执行的问题,并且速度足够快,那么处理这么多数据的 HTTP 请求速度不足以提供良好的用户体验。