【问题标题】:Should I set a compound index or two single field indexes for my operation in MongoDB?我应该为我在 MongoDB 中的操作设置一个复合索引还是两个单字段索引?
【发布时间】:2014-11-10 16:43:53
【问题描述】:

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

  1. 默认_id
  2. 一个不同的uniq_id(每个uniq_id会有多个文档)
  3. 一个合适的时间戳值,文档的 ts

现在,在我的代码中,我希望为给定的uniq_id 提取最旧的 100 个文档。所以我运行这个查询:

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

我现在的问题是:

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

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

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

提前致谢。

【问题讨论】:

    标签: mongodb indexing nosql


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

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

    HTH。

    【讨论】:

      猜你喜欢
      • 2012-11-16
      • 2018-06-02
      • 2011-05-10
      • 2018-05-15
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多