添加索引提高MongoDB查询速度

通过添加索引可以极大提高 MongoDB 的查询效率。

在未添加检索时,查询某个条目需要进行全表搜索,从 explain 的输出中可以看到,需要展开 2581 个文档,耗费 13630 微秒找到指定文档。

"executionStages" : {
  "stage" : "COLLSCAN",
  "filter" : {
    "$and" : [
      {
        "id" : {
          "$eq" : 7821
        }
      },
      {
        "owner" : {
          "$eq" : "nwp_xp"
        }
      },
      {
        "repo" : {
          "$eq" : "hpc"
        }
      }
    ]
  },
  "nReturned" : 1,
  "executionTimeMillisEstimate" : 13630,
  "works" : 2583,
  "advanced" : 1,
  "needTime" : 2581,
  "needYield" : 0,
  "saveState" : 527,
  "restoreState" : 527,
  "isEOF" : 1,
  "invalidates" : 0,
  "direction" : "forward",
  "docsExamined" : 2581
}

我们为 id 字段添加索引:

db.blobs.createIndex({"id": 1}, {unique:true})

再查找相同的文档,则会直接找到该文档。 从 explain 输出中可以看到,MongoDB 使用索引直接找到目标文档,用时为 0 毫秒。

"""inputStage" : {
  "stage" : "IXSCAN",
  "nReturned" : 1,
  "executionTimeMillisEstimate" : 0,
  "works" : 2,
  "advanced" : 1,
  "needTime" : 0,
  "needYield" : 0,
  "saveState" : 0,
  "restoreState" : 0,
  "isEOF" : 1,
  "invalidates" : 0,
  "keyPattern" : {
    "id" : 1
  },
  "indexName" : "id_1",
  "isMultiKey" : false,
  "isUnique" : true,
  "isSparse" : false,
  "isPartial" : false,
  "indexVersion" : 1,
  "direction" : "forward",
  "indexBounds" : {
    "id" : [
      "[7821.0, 7821.0]"
    ]
  },
  "keysExamined" : 1,
  "dupsTested" : 0,
  "dupsDropped" : 0,
  "seenInvalidated" : 0
}

由此可见,使用 MongoDB 也要根据查找任务的特点设计索引,提高查找的效率。