【问题标题】:How to create an index for a complex MongoDB query需要帮助为复杂的 MongoDB 查询创建索引
【发布时间】:2022-01-13 18:54:38
【问题描述】:

我需要为以下查询创建索引:

await Activity.find({
   $and: [
      {
         lastUpdated: {
            $gte: new Date(new Date().getTime() - 7 * 24 * 60 * 60 * 1000),
         },
      },
      {
         "followers._user": _user,
      },
      {
         global: true,
      }
   ]
})
.collation({
   locale: "en_US",
   numericOrdering: true,
})
.sort({
   lastUpdated: -1
})
.skip(
   length
)
.limit(
   10
)

我目前有以下索引,但查询不使用它。

ActivitiesSchema.index(
  { "followers._user": 1, global: 1, lastUpdated: -1 },
  {
    collation: {
      locale: "en_US",
      numericOrdering: true,
    },
  }
);

如果我缺少任何信息或需要提供更多详细信息,请告诉我,我很乐意提供。

【问题讨论】:

  • 怎么知道有没有用?通常我会在 MongoShell 中使用 explain() 来执行查询,以查看规划器希望如何执行查询。您是否确认已创建索引?一般来说,让您的应用程序创建索引是一种不好的做法,因为创建索引可能会给繁忙的系统带来压力。建议在非高峰时间创建索引,而不是让应用程序创建索引。使用 MMS(Atlas,Ops Manager)时,您可以以滚动方式应用索引,而对生产系统的影响很小。
  • @barrypicker 关于应用程序级别的索引管理,我对每个字都表示赞同,但 Mongoose 社区对这一点的看法略有不同mongoosejs.com/docs/guide.html#indexes。他们确实建议在生产系统上禁用自动索引更新,因此将其标记为“不良做法”并让刚开始学习这种相当自以为是的 ODM 的人感到困惑是不公平的。
  • @barrypicker Atlas 告诉我它已经有 X 天没有被使用了,这就是我所知道的。出于某种原因,我无法让 explain() 为我工作,但我确实在 Atlas 的 Profile 选项卡中看到了一个解释,它显示超过 2k 条记录(全部)正在被扫描和返回。我听说你创建了索引,但这是一个位于一个区域的单一业务应用程序,对生产系统的影响很小,因为我在下班时间进行更新。
  • 如果查询规划器没有选择正确的索引,您可以使用hint() 建议他
  • @AlexBlex 我知道用于生产。这些是我的开发数据库中的数字。

标签: mongodb mongoose indexing


【解决方案1】:

将索引更改为:

{ lastUpdated: -1, "followers._user": 1, global: 1 }

注意:它可能会影响其他依赖现有索引的查询

https://docs.mongodb.com/manual/tutorial/sort-results-with-indexes/#sort-and-index-prefix 读作:

如果排序键对应索引键或索引前缀,MongoDB 可以使用索引对查询结果进行排序。复合索引的前缀是由在索引键模式的开头的一个或多个键组成的子集。

由于您是按“lastUpdated”排序的,因此索引应该从它开始。

NB 2:有了这个改变,Mongodb 可以使用,但不能保证。还有许多其他因素,例如选择性和基数,例如global: true, 意味着从该字段的索引中受益的基数极低。另一方面,如果用户关注的不多并且总活动量很大,那么通过“followers._user”索引进行过滤并进行内存排序可能会更便宜。由查询规划器决定使用哪个索引。

【讨论】:

  • 做到了!谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-06-26
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 2019-05-31
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多