我应该为MongoDB中的操作设置复合索引还是两个单字段索引?

时间:2014-11-10 16:43:53

标签: mongodb indexing nosql

所以,我在MongoDB中的以下模型中有数据:

  1. 默认_id
  2. 一个distint uniq_id(每个uniq_id会有多个文档)
  3. 文档的合适时间戳值ts,
  4. 现在,在我的代码中的某个地方,我希望为给定的uniq_id提取最早的100个文档。所以我运行这个查询:

    db.students.find({uniq_id:"xyz"}).limit(100).sort({ts:1})
    

    我现在的问题是:

    1. limit()如何运作?它会使用默认的_id来获取前100个文档吗?换句话说,如果我有find()生成的1100个文档,我知道limit(100)能够提取文档1-100。它是通过使用默认的_id索引吗?

    2. 来实现的
    3. 要根据时间戳对其进行排序(再次强调我想要最早的100个文档),我是否需要在uniq_id和时间戳上设置复合索引,或者最好创建两个单一的uniq_id上的索引和时间戳分别?

    4. 我假设两个单字段索引可以完成这项工作。有人可以帮我解决这个问题吗?

      提前致谢。

1 个答案:

答案 0 :(得分:0)

  1. limit(n)将返回数据库返回的前n个结果。在示例查询中,结果按ts排序。当通过查询优化器时,MongoDB将首先根据给定的排序键进行排序,然后限制结果。
  2. 您应该使用复合索引。但请记住,order matters。因此,对于您的示例,应创建复合索引

    db.students.ensureIndex({uniq_id:1,ts:1})
    
  3. 使用.explain()找出最适合您的方式。

  4. HTH。