【问题标题】:Do mongo find queries perform faster with more criteria?mongo find 查询在更多条件下执行得更快吗?
【发布时间】:2014-08-17 22:30:04
【问题描述】:

通过使用更多条件限制查找(或 findOne)是否会提高性能?

一个例子:

db.users.find({_id : ObjectId("111111111111111111111111")})

db.users.find({_id : ObjectId("111111111111111111111111"), accountId : ObjectId("22222222222222222222222")})

另一个例子:

db.users.find({full_name: 'Lionel Messi'})

db.users.find({full_name : 'Lionel Messi', first_name : 'Lionel', last_name : 'Messi' })

【问题讨论】:

    标签: performance mongodb optimization mongodb-query query-performance


    【解决方案1】:

    通常,不会。因为 mongoDB 倾向于返回找到的前 N ​​个值的游标,所以如果您更加具体,找到符合该条件的值将需要更长的时间。

    如果您想查看影响查询速度的因素,最好使用explain() 方法。

    更多详情请看这里:http://docs.mongodb.org/manual/tutorial/analyze-query-plan/

    【讨论】:

      【解决方案2】:

      不,因为您使用的是独特的 _id

      至于让查询变慢:如果{_id, accountId} 上没有复合索引,它可能最多会慢几纳秒,因为一旦找到了_id 索引的文档,它们将被加载到内存中以匹配accountId 字段。

      MongoDB 会先按索引查找,然后再查看不属于所选索引的字段。

      但是,由于您的查询(未被发现)将在返回之前加载文档,唯一减慢查询速度的是最终匹配,其速度基本上可以忽略不计。

      【讨论】:

      • 我明白了。添加了第二个示例。还对非唯一 _id 案例感到好奇。
      • @Chandrew 在这种情况下:确实,如果查询命中复合索引,i5t 会比不搜索更快,并且只搜索 full_name,因为加载多个文档的结果会节省时间
      【解决方案3】:

      在这种情况下没有。 _id 会自动编入索引并唯一标识文档。第一个标准

      {_id : ObjectId("111111111111111111111111")}
      

      将使用索引查找文档。检查accountId 的值实际上会使查询变慢,因为MongoDB 必须检查另一个值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-25
        相关资源
        最近更新 更多