优化MongoDB中的查询性能

时间:2015-02-12 18:58:52

标签: mongodb indexing

我有一个名为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

2 个答案:

答案 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密钥
  • 上添加索引
  • 将您的字符串更改为数字。