【发布时间】: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 我知道用于生产。这些是我的开发数据库中的数字。