注册

详解MongoDB的index_stats()函数:获取集合中索引的统计信息

我来为您讲解MongoDB的index_stats()函数的作用与使用方法的完整攻略。

作用

index_stats()函数是MongoDB的一个用于索引统计的函数,它用于分析和返回关于集合中索引使用情况的统计信息,包括每个索引的使用频率、命中率、丢失率以及其它一些统计数据,可以对MongoDB中的索引进行校验、优化和调整,从而提高查询性能。

使用方法

语法:

db.collection.indexStats( { } )

参数:

{ }:一个可选的查询条件,指定了只返回符合查询条件的索引信息。

返回值:

包含有关集合中索引使用情况的各种统计信息(包括每个索引的使用频率、命中率、丢失率等),以及查询条件的索引信息。

注意:

  • indexStats()函数只能应用于集合级别,不能用于整个数据库级别。
  • 此函数必须在 admin 的权限下执行,例如使用以下命令切换到 admin 数据库,然后执行查询:

js
use admin
db.runCommand( { collStats: "collection", indexDetails: true } )

下面将通过两个实例说明index_stats()函数的使用方法和重点参数。

示例一:统计集合中的所有索引信息

假设我们有一个名为students的集合,我们需要统计该集合中所有索引的使用情况。执行以下代码:

use test  // 首先选择一个你要统计的库
db.students.indexStats()

返回结果如下:

{
  "name": "_id_",
  "key": {
    "_id": 1
  },
  "host": "localhost:27017",
  "accesses": {
    "ops": 7,
    "since": "2021-10-25T09:20:24.9393258Z"
  },
  "process": "MongoDB Shell",
  "created": ISODate("2021-10-25T08:38:47Z"),
  "expires": ISODate("2021-11-24T08:38:47Z"),
  "cacheHits": 7,
  "cacheMisses": 0,
  "winningPlan": {
    "stage": "FETCH",
    "inputStage": {
      "stage": "IXSCAN",
      "keyPattern": {
        "_id": 1
      },
      "indexName": "_id_",
      "isMultiKey": false,
      "multiKeyPaths": {
        "_id": []
      },
      "isUnique": true,
      "isSparse": false,
      "isPartial": false,
      "indexVersion": 2,
      "direction": "forward",
      "indexBounds": {
        "_id": ["[MinKey, MaxKey]"]
      }
    }
  },
  "rejectedPlans": []
},
{
  "name": "score_1",
  "key": {
    "score": 1
  },
  "host": "localhost:27017",
  "accesses": {
    "ops": 2,
    "since": "2021-10-25T09:03:14.9128284Z"
  },
  "process": "MongoDB Shell",
  "created": ISODate("2021-10-25T09:02:03Z"),
  "expires": ISODate("2021-11-24T09:02:03Z"),
  "cacheHits": 0,
  "cacheMisses": 2,
  "winningPlan": {
    "stage": "FETCH",
    "inputStage": {
      "stage": "IXSCAN",
      "keyPattern": {
        "score": 1
      },
      "indexName": "score_1",
      "isMultiKey": false,
      "multiKeyPaths": {
        "score": []
      },
      "isUnique": false,
      "isSparse": false,
      "isPartial": false,
      "indexVersion": 2,
      "direction": "forward",
      "indexBounds": {
        "score": ["[MinKey, MaxKey]"]
      }
    }
  },
  "rejectedPlans": []
}

其中,每一个对象代表一个索引,包含该索引的各种统计信息,如索引名称、键值、索引命中次数、创建时间、过期时间等。此时并未对查询条件进行统计。

示例二:统计指定索引的使用情况

假设我们需要统计students集合中score字段所对应的索引的使用情况,只返回符合条件的索引信息。执行以下代码:

use test  // 首先选择一个你要统计的库
db.students.indexStats( { name: "score_1" } )

返回结果如下:

{
  "name": "score_1",
  "key": {
    "score": 1
  },
  "host": "localhost:27017",
  "accesses": {
    "ops": 1,
    "since": "2021-10-25T09:51:59.5789474Z"
  },
  "process": "MongoDB Shell",
  "created": ISODate("2021-10-25T09:02:03Z"),
  "expires": ISODate("2021-11-24T09:02:03Z"),
  "cacheHits": 0,
  "cacheMisses": 1,
  "winningPlan": {
    "stage": "FETCH",
    "inputStage": {
      "stage": "FETCH",
      "inputStage": {
        "stage": "IXSCAN",
        "keyPattern": {
          "score": 1
        },
        "indexName": "score_1",
        "isMultiKey": false,
        "multiKeyPaths": {
          "score": []
        },
        "isUnique": false,
        "isSparse": false,
        "isPartial": false,
        "indexVersion": 2,
        "direction": "forward",
        "indexBounds": {
          "score": ["[MinKey, MaxKey]"]
        }
      }
    }
  },
  "rejectedPlans": []
}

很明显,只返回了满足条件的一条索引记录。#%%