【问题标题】:How to see which queries are using an index in MongoDB?如何查看哪些查询正在使用 MongoDB 中的索引?
【发布时间】:2019-09-21 13:46:46
【问题描述】:

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

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

编辑:澄清一下,我想查看 哪些查询使用了索引,而不是使用 explain 来查看特定查询使用哪些索引。

【问题讨论】:

  • 你有答案吗?
  • @AviCohen 是的,有点,但这不是直截了当的。我最终查看了集合的查询计划缓存并提取了索引分数,以了解它们的使用情况。这需要一些脚本来创建统计分析。

标签: mongodb indexing


【解决方案1】:

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

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

db.collection.find().explain()

更多信息请阅读MongoDB Explain

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

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

来自official docs

索引

与索引操作相关的消息,例如创建索引。至 指定 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了解更多信息。

【讨论】:

  • 我不是说空运行,我想知道历史上哪些查询使用了索引。
  • 我认为您必须使用 .explain() 运行查询,然后自己查看
  • 这不是历史数据,我会假设有日志?
  • 我认为索引使用不是索引操作,应该为查询操作设置详细程度。
【解决方案2】:

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

从日志中grep“COLLSCAN”,你就明白了。如果使用索引,则查询计划显示“IXSCAN”。如果它必须扫描集合,则显示“COLLSCAN”。我以这种方式发现了一些缓慢的查询。查询未正确使用索引的另一个症状是数据库服务器上持续的高 CPU 负载。

【讨论】:

  • 很遗憾我无法访问服务器。
【解决方案3】:

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

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

使用.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,那么您的特定索引正在被使用。但如果您将阶段视为COLSCAN(收集扫描),则不使用索引。

    索引查询和非索引查询的 JSON 比较:

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

    queryPlanner: MongoDB 运行 query optimizer 来选择正在评估的操作的获胜计划。 queryPlanner 解释,查询优化器选择了哪些计划已选择和拒绝。

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

2。如果您在 mongoDB 中使用 NoSQLBooster。 然后只需编写查询并单击说明,它将显示正在使用的索引。

索引未使用:

使用的索引:

【讨论】:

    猜你喜欢
    • 2021-08-31
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    相关资源
    最近更新 更多