Docs 菜单
Docs 主页
/
数据库手册
/ / / / /

解释慢速查询

explain()方法提供有关MongoDB如何规划和执行给定查询的信息。在对查询性能进行故障排除和规划优化时,您可能会发现这些信息很有用。

explain()方法可用于使用以下方法的查询:

  • aggregate()

  • count()

此任务对示例查询运行explain() 方法,尝试识别性能问题。实际上,对应用程序运行的每个查询都运行explain() 可能很困难。

要将应用程序发送的查询列表缩小到仅慢速查询,可以使用分析器:

剖析器
说明

Atlas 查询分析器

为Atlas客户提供图表,以便轻松识别慢速查询和性能异常值。

将查询性能信息存储在集合中,允许您在MongoDB查询存在特定性能问题的查询。

Atlas查询分析器和数据库分析器都会影响服务器性能、占用磁盘空间并暴露有关加密字段的查询元数据。在启用它们之前,请考虑对性能和安全的影响。

1

使用explain() 方法运行要评估的查询:

db.movies.explain( "executionStats").find( {
year: { $gt: 1990 },
rated: { $in: [ "PG", "PG-13" ] }
} )
2

检查explain.executionStats.executionTimeMillis 字段以查看执行时间(以毫秒为单位)。这显示了总时间,包括构建和选择查询计划所需的时间以及执行计划所需的时间。

  • 如果执行时间在应用程序和数据库需求的可接受范围内,则无需优化。

  • 如果执行时间超过可接受的时间,则需要进一步分析,以确定为什么查询需要这么长时间才能执行。

3

查询可以分几个阶段执行。在每个阶段, MongoDB都会收集前一阶段的文档以执行下一设立操作。explain.executionStats.executionStages 提供有关每个执行阶段的信息,其中每个级别的inputStage 字段显示MongoDB如何为该阶段选择文档。

inputStage.stage检查每个执行阶段的 字段:

COLLSCAN
指示MongoDB执行了集合扫描。
IXSCAN
指示MongoDB执行了索引扫描。
FETCH

表示MongoDB已从数据库获取完整文档。

如果查询返回少量字段,并且应用程序对此集合的写入不是密集型,请考虑添加索引来涵盖查询。这允许MongoDB从索引中获取字段值,而不是读取完整文档。

有关更多信息,请参阅涵盖的查询。

PROJECTION
指示MongoDB在内存中筛选的返回字段。
SORT
指示MongoDB在内存中对文档进行排序或使用了覆盖索引。

执行显示 COLLSCAN 阶段的过滤或排序操作的查询将受益于索引。

有关更多信息,请参阅创建索引。

4

对带有索引的集合的查询可能无法有效利用索引。

将检查的密钥数量与检查的文档数量进行比较。如果键的数量明显少于文档的数量,则表明索引无效。

检查查询的总值,确保executionStats.totalDocsExamined 显示的值不大于executionStats.totalKeysExamined

如果检查的密钥数量远低于检查的文档数量,请检查executionStages 字段中的每个阶段,比较keysExamineddocsExamined 以确定哪个阶段未能使用索引。然后,创建索引以适应该阶段的查询。

5

使用筛选器指定结果的查询可能会出现问题。要识别效率低下的过滤,请将 字段的值与executionStats.totalDocsExamined executionStats.nReturned字段的值进行比较。

  • 如果 totalDocsExamined 的值远大于 nReturned 的值,则表示索引无效。也就是说, MongoDB必须扫描集合才能过滤结果。

    在过滤字段上创建索引以提高性能。

  • 如果 totalDocsExaminednReturned 具有相同的值,则表示MongoDB仅检查其返回的文档。这表示索引有效。

后退

解释结果

在此页面上