explain()
方法提供有关MongoDB如何规划和执行给定查询的信息。在对查询性能进行故障排除和规划优化时,您可能会发现这些信息很有用。
关于此任务
解释查询
explain()
方法可用于使用以下方法的查询:
分析器
此任务对示例查询运行explain()
方法,尝试识别性能问题。实际上,对应用程序运行的每个查询都运行explain()
可能很困难。
要将应用程序发送的查询列表缩小到仅慢速查询,可以使用分析器:
剖析器 | 说明 |
---|---|
为Atlas客户提供图表,以便轻松识别慢速查询和性能异常值。 | |
将查询性能信息存储在集合中,允许您在MongoDB查询存在特定性能问题的查询。 |
Atlas查询分析器和数据库分析器都会影响服务器性能、占用磁盘空间并暴露有关加密字段的查询元数据。在启用它们之前,请考虑对性能和安全的影响。
步骤
解释该查询。
使用explain()
方法运行要评估的查询:
db.movies.explain( "executionStats").find( { year: { $gt: 1990 }, rated: { $in: [ "PG", "PG-13" ] } } )
评估执行时间。
检查explain.executionStats.executionTimeMillis
字段以查看执行时间(以毫秒为单位)。这显示了总时间,包括构建和选择查询计划所需的时间以及执行计划所需的时间。
如果执行时间在应用程序和数据库需求的可接受范围内,则无需优化。
如果执行时间超过可接受的时间,则需要进一步分析,以确定为什么查询需要这么长时间才能执行。
评估执行阶段。
查询可以分几个阶段执行。在每个阶段, MongoDB都会收集前一阶段的文档以执行下一设立操作。explain.executionStats.executionStages
提供有关每个执行阶段的信息,其中每个级别的inputStage
字段显示MongoDB如何为该阶段选择文档。
inputStage.stage
检查每个执行阶段的 字段:
COLLSCAN
- 指示MongoDB执行了集合扫描。
IXSCAN
- 指示MongoDB执行了索引扫描。
FETCH
表示MongoDB已从数据库获取完整文档。
如果查询返回少量字段,并且应用程序对此集合的写入不是密集型,请考虑添加索引来涵盖查询。这允许MongoDB从索引中获取字段值,而不是读取完整文档。
PROJECTION
- 指示MongoDB在内存中筛选的返回字段。
SORT
- 指示MongoDB在内存中对文档进行排序或使用了覆盖索引。
执行显示 COLLSCAN
阶段的过滤或排序操作的查询将受益于索引。
评估密钥检查。
对带有索引的集合的查询可能无法有效利用索引。
将检查的密钥数量与检查的文档数量进行比较。如果键的数量明显少于文档的数量,则表明索引无效。
检查查询的总值,确保executionStats.totalDocsExamined
显示的值不大于executionStats.totalKeysExamined
。
如果检查的密钥数量远低于检查的文档数量,请检查executionStages
字段中的每个阶段,比较keysExamined
和docsExamined
以确定哪个阶段未能使用索引。然后,创建索引以适应该阶段的查询。
评估过滤。
使用筛选器指定结果的查询可能会出现问题。要识别效率低下的过滤,请将 字段的值与executionStats.totalDocsExamined
executionStats.nReturned
字段的值进行比较。