我有一个名为App
的集合,需要查询属于特定用户(active: true
)的所有有效(user_id
)应用或所有用户都可以使用(通过他们的{ {1}})。我使用像这样的查询
_id
但是在{
"active" : true,
"$or" : [
{
"user_id" : "111111111111111111111111"
},
{
"_id" : {
"$in" : [
ObjectId("222222222222222222222222"),
ObjectId("333333333333333333333333"),
ObjectId("444444444444444444444444")
]
}
}
]
}
中,我发现此查询的运行速度非常慢:db.currentOp(true)
约为lockStats.timeLockedMicros.r
。
如何优化此查询的性能?我在3000
上已经有以下索引:
App
答案 0 :(得分:0)
我在这里看到两个问题:
1)你不需要在布尔字段active
上使用索引,因为它具有低选择性并且不会使查询性能受益。
“如果总体选择性较低,并且如果MongoDB必须读取大量文档以返回结果,那么一些查询可能在没有索引的情况下执行得更快。” source
2)您需要user_id
的索引,因为user_id
无法使用您为active_1_user_id_1
创建的复合索引
编辑:您始终可以通过explain(true)
检查索引效率,并查看该查询使用的索引。
答案 1 :(得分:0)
我会尝试执行以下操作:
active
字段的基数较低(布尔值)并且对您没有任何帮助,您没有使用created_at
,因此没有理由这样做。user_id
密钥