我看到MongoDB正在使用索引,但是我不确定哪个查询正在使用它。
如何查看哪些查询正在使用索引?
答案 0 :(得分:0)
您可以使用.explain()运行查询,以查找该特定查询中正在使用的索引。
例如。通过.find()
,您可以像这样使用.explain()
:
db.collection.find().explain()
有关更多信息,请阅读MongoDB Explain
编辑:检查日志中使用的索引
要检查特定查询中正在使用的索引,可以在mongodb配置中启用索引级别的日志。
INDEX
与索引操作有关的消息,例如创建索引。至 指定INDEX组件的日志级别,设置 systemLog.component.index.verbosity参数。
启用systemLog.component.index.verbosity
参数以启用索引日志。
来自文档:
systemLog.component.index.verbosity类型:整数
默认值:0
3.0版的新功能。
与索引相关的组件的日志消息详细级别 操作。请参阅INDEX组件。
详细程度范围为0到5:
0是MongoDB的默认日志详细级别,其中包括 信息性消息。 1到5将详细程度提高到 包括调试消息。
答案 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
(集合扫描),则不使用索引。
了解架构:(official link) .explain("allPlansExecution")
响应的基本 JSON 结构是这样的:
queryPlanner: MongoDB 运行 query optimizer
为正在评估的操作选择获胜计划。 queryPlanner 解释了,其中详细说明了查询优化器已选择的计划已选择和拒绝。
executionStats: MongoDB 运行查询优化器来选择获胜计划,执行获胜计划直至完成,并返回描述获胜计划执行情况的统计信息。
2.如果您将 NoSQLBooster 用于 mongoDB。那么只需编写您的查询并单击解释,它就会显示正在使用哪些索引。