我应该在MongoDB中使用$ in来进行高性能查询吗?

时间:2011-12-02 05:08:16

标签: mongodb

考虑集合中的以下数据结构:

{
_id : ObjectId("4ec6c015482c4c8302000001"),
uid : ObjectId("4ec6c015482c4c8302003233") //reference to user's Object ID
someValue : some json object,
}

所述集合将在uid上进行分片。

在这两种情况之间,哪种情况更适合阅读?

选项A)

存储对users对象中每个数据结构的引用并执行此查询:

db.collection.find({_id: {$in: ids}}

选项B)

在uid上创建索引并以这种方式查询:

db.collection.find({uid : ObjectId("4ec6c015482c4c8302003233")})

每个结果集将包含0-20个集合中的数据结构。

总结:找到()20个特定ID或所有与索引ID值匹配的对象(结果集也是20)会更快吗?

3 个答案:

答案 0 :(得分:2)

选项(B)更好,更直接:

i)您不需要单独存储_ids的引用。

ii)如果uid上存在索引,您的查询速度很快,无需优化。

iii)sortlimitfindOne等其他操作可以使用基本语法。 使用选项(A),您必须始终获取整个数据并对其执行操作。

答案 1 :(得分:2)

在uid上创建索引,答案就是这样。

      uid    V.S.   _id  _id  _id 
      /|\            |    |    |
  doc doc doc       doc  doc  doc

你推入查询的_id越多,对_id的检查越多,这意味着额外的i / o。获取文档的时间是一样的。

答案 2 :(得分:0)

如果选择选项A)并且没有索引,则选项B)将更具性能。如果您将所有数据完全存储在内存中,那么使用B)会更加高效(因为应用程序只需要比较一个值,而不是几个值),即使很难。