2011-02-10 80 views
32

在MongoDB中使用$ in操作符的缓慢/糟糕的形式是否有很多可能性?

posts.find({ 
    author : { 
     $in : ['friend1','friend2','friend3'....'friend40'] 
    } 
}) 

应用程序引擎,例如,不会让因为他们的阵中翻译每件直接到一个查询,所以不是强迫你使用他们的方法来处理fan out您使用超过30。虽然这可能是Mongo中最有效的方法,但它的代码显得更加复杂,所以我宁愿只使用这种泛型方法。

对于合理大小的数据集,Mongo会有效地执行这些$查询吗?

+0

你在你的作者领域有一些索引吗? – shingara 2011-02-10 10:08:04

+0

你好@Derek Dahmer,你能解决这个问题吗?我一直在处理这个问题。这名建筑师今天命名为Edge Collection by MongoDB :)我也希望使用$ in参数和巨大的数组。但我提防性能影响! http://image.slidesharecdn.com/socialitept2-140724104718-phpapp01/95/socialite-the-open-source-status-feed-part-2-managing-the-social-graph-18-638.jpg?cb= 1406222239 – efkan 2015-02-09 13:48:43

回答

18

对于$ in,它可以相当有效地处理小列表(很难说小是什么,但至少是几十/几百)。它不像app-engine那样工作,因为mongodb具有实际的btree索引,而不是像bigtable那样的列存储。

如果没有要使用的索引,使用$就可以在索引中跳过以查找匹配的文档,或遍历整个集合。

3

假设已创建的author字段索引,从算法点,$in操作的时间复杂度为:$(N*log(M)),其中N是输入阵列的长度和M是集合的大小。

$in操作的时间复杂度,除非你改变一个数据库(虽然我不认为任何数据库可以打破O(N*log(M)))将不会改变

但是,从工程角度来看,如果N达到一个大数字,最好让您的业务逻辑服务器通过批量或逐个模拟$in操作。

这只是因为:数据库服务器中的内存比业务逻辑服务器中的内存更有价值。