【问题标题】:Is searching by _id in mongoDB more efficient?在 mongoDB 中按 _id 搜索是否更有效?
【发布时间】:2021-08-05 07:48:56
【问题描述】:

在我的用例中,我想在 MongoDB 中通过给定的唯一字符串搜索文档。但是,我希望我的查询速度很快,并且按 _id 搜索会增加一些开销。我想知道在 MongoDB 中通过 _id 搜索文档而不是任何其他唯一值是否有任何好处?
据我所知,对象 ID 类似于文档中的任何其他唯一值[仅针对搜索的情况提出的观点]。

至于开销,您可以假设我将字符串缓存到 objectID 并且缓存非常小并且在内存中 [几乎可以忽略不计],尽管数据库很大。

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    简短的回答,是的,_id 是主键,并且已编入索引。当然很快。

    但您也可以在其他字段上使用索引并获得更有效的查询。

    【讨论】:

      【解决方案2】:

      分析您的查询性能

      我建议你使用mongoDB提供的.explain()来分析你的查询性能。

      假设我们正在尝试执行此查询

      db.inventory.find( { quantity: { $gte: 100, $lte: 200 } } )
      

      这将是查询执行的结果

      { "_id" : 2, "item" : "f2", "type" : "food", "quantity" : 100 }
      { "_id" : 3, "item" : "p1", "type" : "paper", "quantity" : 200 }
      { "_id" : 4, "item" : "p2", "type" : "paper", "quantity" : 150 }
      

      如果我们这样称呼.execution()

      db.inventory.find(
         { quantity: { $gte: 100, $lte: 200 } }
      ).explain("executionStats")
      

      它将返回以下结果:

      {
         "queryPlanner" : {
               "plannerVersion" : 1,
               ...
               "winningPlan" : {
                  "stage" : "COLLSCAN",
                  ...
               }
         },
         "executionStats" : {
            "executionSuccess" : true,
            "nReturned" : 3,
            "executionTimeMillis" : 0,
            "totalKeysExamined" : 0,
            "totalDocsExamined" : 10,
            "executionStages" : {
               "stage" : "COLLSCAN",
               ...
            },
            ...
         },
         ...
      }
      

      更多详情请见here

      通过 _id 和索引搜索的效率如何

      要回答您的问题,使用索引总是更有效。索引是一种特殊的数据结构,它以易于遍历的形式存储集合数据集的一小部分。 _id 是 MongoDB 提供的默认索引,这样可以提高效率。

      没有索引,MongoDB 必须执行集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。

      所以,是的,使用像_id 这样的索引更好!

      您也可以使用createIndex()创建自己的索引

      db.collection.createIndex( <key and index type specification>, <options> )
      
      

      优化您的 MongoDB 查询

      如果您想优化查询,有多种方法可以做到这一点。

      • 创建自定义索引以支持您的查询
      • 限制查询结果的数量以减少网络需求
      db.posts.find().sort( { timestamp : -1 } ).limit(10)
      
      • 使用投影仅返回必要的数据
      db.posts.find( {}, { timestamp : 1 , title : 1 , author : 1 , abstract : 1} ).sort( { timestamp : -1 } )
      
      • 使用$hint 选择特定索引
      db.users.find().hint( { age: 1 } )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-03
        • 2014-10-21
        • 1970-01-01
        • 1970-01-01
        • 2014-10-15
        • 1970-01-01
        • 1970-01-01
        • 2019-08-03
        相关资源
        最近更新 更多