参考 > MongoDB CRUD操作 > MongoDB CRUD概念 > 分析查询性能
在本页面
该
cursor.explain("executionStats")
和db.collection.explain("executionStats")
方法提供了有关查询的性能统计信息。这些统计信息可用于衡量查询是否以及如何使用索引。
db.collection.explain()
提供有关其他操作执行的信息,例如db.collection.update()
。有关db.collection.explain()
详细信息,请参见
。
MongoDB Compass提供了一个“ 解释计划” 选项卡,该选项卡显示有关查询性能的统计信息。这些统计信息可用于衡量查询是否以及如何使用索引。
考虑inventory
包含以下文档的集合:
这些文档在MongoDB Compass中的显示如下:
以下查询检索该quantity
字段的值介于100
和之间200
(含)的文档
:
该查询返回以下文档:
要查看所选的查询计划,请将
cursor.explain("executionStats")
游标方法链接到find命令的末尾:
explain()
返回以下结果:
queryPlanner.winningPlan.stage
显示
COLLSCAN
以指示收集扫描。
集合扫描表明,
mongod
必须逐个文档扫描整个集合文档以识别结果。这通常是一项昂贵的操作,并且可能导致查询缓慢。
executionStats.nReturned
显示3
表示查询匹配并返回三个文档。
executionStats.totalKeysExamined
显示0
以指示这是查询未使用索引。
executionStats.totalDocsExamined
显示10
以指示MongoDB必须扫描十个文档(即集合中的所有文档)才能找到三个匹配的文档。
以下查询检索该quantity
字段的值介于100
和之间200
(含)的文档
:
将以下过滤器复制到“指南针”查询栏中,然后单击“ 查找”:
该查询返回以下文档:
要查看所选的查询计划:
test.inventory
。MongoDB Compass显示查询计划,如下所示:
注意
因为在本教程中我们正在使用如此小的数据集,所以即使我们没有使用索引,“
实际查询执行时间”0
也会显示
秒。
在更大的数据集中,索引查询与非索引查询之间的查询执行时间差异会更大。
该查询性能概要显示查询的执行统计:
3
以指示查询匹配并返回三个文档。0
以指示此查询未使用索引。10
表明MongoDB必须扫描十个文档(即集合中的所有文档)才能找到三个匹配的文档。在“ 查询性能摘要”下,MongoDB Compass显示COLLSCAN
查询阶段,以指示对该查询使用了集合扫描。
集合扫描表明,
mongod
必须逐个文档扫描整个集合文档以识别结果。这通常是一项昂贵的操作,并且可能导致查询缓慢。
也可以通过单击查询栏下方的Raw JSON以原始JSON格式查看说明详细信息:
匹配文档数和已检查文档数之间的差异可能表明,为了提高效率,查询可能会受益于索引的使用。
要支持对该quantity
字段的查询,请在该字段上添加一个索引
quantity
:
要查看查询计划统计信息,请使用以下
explain("executionStats")
方法:
该explain()
方法返回以下结果:
queryPlanner.winningPlan.inputStage.stage
显示
IXSCAN
以指示索引的使用。executionStats.nReturned
显示3
表示查询匹配并返回三个文档。executionStats.totalKeysExamined
显示3
以指示MongoDB扫描了三个索引条目。检查的键数与返回的文档数相匹配,这意味着mongod
只需检查索引键即可返回结果。在
mongod
没有扫描所有的文件,只有三个匹配文档不得不被拉入内存中。这导致非常有效的查询。executionStats.totalDocsExamined
屏幕显示3
MongoDB扫描了三个文档。test.inventory
。quantity
从
选择一个字段名称下拉。1 (asc)
返回到收集的“ 解释计划”选项卡,
inventory
然后从上一步重新运行查询:
MongoDB Compass显示查询计划,如下所示:
FETCH
和IXSCAN
。
IXSCAN
指示
mongod
在执行FETCH
阶段和检索文档之前使用索引来满足查询。也可以通过单击查询栏下方的Raw JSON以原始JSON格式查看说明详细信息:
没有索引,查询将扫描整个10
文档集合以返回3
匹配的文档。该查询还必须扫描每个文档的整体,可能会将它们拉入内存。这导致昂贵且可能缓慢的查询操作。
当使用索引运行时,查询会扫描3
索引条目和3
文档以返回3
匹配的文档,从而产生非常高效的查询。
若要手动比较使用多个索引的查询的性能,可以将该hint()
方法与该explain()
方法结合使用。
考虑以下查询:
该查询返回以下文档:
要支持查询,请添加复合索引。对于复合索引,字段的顺序很重要。
例如,添加以下两个复合索引。第一个索引按quantity
字段顺序排序,然后按
type
字段排序。第二个索引按顺序排序type
,然后按quantity
字段排序。
评估第一个索引对查询的影响:
该explain()
方法返回以下输出:
MongoDB扫描了5
索引键(executionStats.totalKeysExamined
)以返回2
匹配的文档(executionStats.nReturned
)。
评估第二个索引对查询的影响:
该explain()
方法返回以下输出:
MongoDB扫描了2
索引键(executionStats.totalKeysExamined
)以返回2
匹配的文档(executionStats.nReturned
)。
对于此示例查询,复合索引
比复合索引效率更高。{ type: 1, quantity: 1 }
{ quantity: 1, type: 1 }
也可以看看