Mongo $ in运营商表现

时间:2011-02-10 09:11:44

标签: mongodb

在MongoDB中使用带有大量可能性的$ in运算符是缓慢/差的形式吗?

posts.find({
    author : {
        $in : ['friend1','friend2','friend3'....'friend40'] 
    }
})
例如,App Engine不会让你使用超过30个,因为它们直接转换为IN数组中每个项目的一个查询,因此强迫你使用他们的方法来处理fan out。虽然这可能是Mongo中最有效的方法,但它的代码要复杂得多,所以我更喜欢使用这种通用方法。

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

3 个答案:

答案 0 :(得分:25)

对于$ in而言,使用小列表(很难说小,但至少是几十/几百)可能相当有效。它不像app-engine那样工作,因为mongodb有实际的btree索引而且不像bigtable这样的列存储。

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

答案 1 :(得分:10)

如果在list元素上构建索引(ensureIndex),它应该非常快。

你尝试过使用explain()吗?它是一种很好的内置方式来分析您的查询: http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-Use%7B%7Bexplain%7D%7D

答案 2 :(得分:9)

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

除非您更改数据库,否则$in操作的时间复杂度将不会更改(尽管我不认为任何数据库可能会中断O(N*log(M)))。

但是,从工程角度来看,如果N变为大数字,最好让您的业务逻辑服务器模拟$in操作,无论是批量操作还是逐个操作一。

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