如何查看MongoDB中使用索引的查询?

时间:2019-09-21 13:46:46

标签: mongodb indexing

我看到MongoDB正在使用索引,但是我不确定哪个查询正在使用它。

如何查看哪些查询正在使用索引?

3 个答案:

答案 0 :(得分:0)

您可以使用.explain()运行查询,以查找该特定查询中正在使用的索引。

例如。通过.find(),您可以像这样使用.explain()

db.collection.find().explain()

有关更多信息,请阅读MongoDB Explain

编辑:检查日志中使用的索引

要检查特定查询中正在使用的索引,可以在mongodb配置中启用索引级别的日志。

来自official docs

  

INDEX

     

与索引操作有关的消息,例如创建索引。至   指定INDEX组件的日志级别,设置   systemLog.component.index.verbosity参数。

启用systemLog.component.index.verbosity参数以启用索引日志。

来自文档:

  

systemLog.component.index.verbosity类型:整数

     

默认值:0

     

3.0版的新功能。

     

与索引相关的组件的日志消息详细级别   操作。请参阅INDEX组件。

     

详细程度范围为0到5:

     

0是MongoDB的默认日志详细级别,其中包括   信息性消息。 1到5将详细程度提高到   包括调试消息。

阅读MongoDB configuration options - Index verbosity了解更多信息。

答案 1 :(得分:0)

如果您有权访问服务器,那么了解不使用索引的查询的一种方法是查看mongodb日志文件。

从日志中复制“ COLLSCAN”,您就知道了。如果使用索引,则查询计划显示“ IXSCAN”。如果必须扫描收集,则显示“ COLLSCAN”。我发现这种方式的查询很慢。查询未正确使用索引的另一个症状是数据库服务器上的CPU持续不断的高负载。

答案 2 :(得分:0)

在繁重的数据库中,索引起着重要的作用。

因此,您可以通过向查询添加 .explain("allPlansExecution") 或点击 Explain 中的 NoSQLBooster 来运行查询,如下所示。

使用 .explain("allPlansExecution") 运行您的查询:如下所示:

db.userdata.find({ "User.CountryID" : 10 })
   .projection({})
   //.sort({_id:-1})
   .limit(10)
   .explain("allPlansExecution")

.explain("allPlansExecution") 说明您是否正在使用索引。

我已经解释了 JSON 以及图形视图:

1.如果要检查 JSON,则:

  • 使用 .explain("allPlansExecution") 运行查询,您将获得 JSON。如果您可以将 stage 视为 IXSCAN,则表示正在使用您的特定索引。但如果您将 stage 视为 COLSCAN(集合扫描),则不使用索引。

    索引查询和非索引查询的JSON比较: enter image description here

  • 了解架构:(official link) .explain("allPlansExecution") 响应的基本 JSON 结构是这样的:

    enter image description here

    queryPlanner: MongoDB 运行 query optimizer 为正在评估的操作选择获胜计划。 queryPlanner 解释了,其中详细说明了查询优化器已选择的计划已选择和拒绝。

    executionStats: MongoDB 运行查询优化器来选择获胜计划,执行获胜计划直至完成,并返回描述获胜计划执行情况的统计信息。

2.如果您将 NoSQLBooster 用于 mongoDB。那么只需编写您的查询并单击解释,它就会显示正在使用哪些索引。

未使用索引: enter image description here

使用的索引: enter image description here