Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs 菜单
Docs 主页
/ /

对生产中的慢查询进行故障排除

本页介绍查询缓慢的常见原因和解决方法。如果在完成以下部分后需要其他支持,联系 技术支持。

要确认您的部署是否遇到慢速查询问题,请检查以下内容:

要确认查询实际上很慢,请将当前查询延迟与历史基线或服务级别目标进行比较。确定缓慢是持续存在的还是在特定负载模式下发生的,例如负载峰值、批处理作业或维护窗口。

使用数据库分析器和慢速查询日志,按命名空间、模式和延迟来识别特定操作。

对于Atlas,使用 Performance Advisor和查询分析器查找执行时间较长的查询。

确认集群和节点的运行状况。检查以下方面是否存在问题:

  • 主节点/从节点(secondary node from replica set)状态

  • 复制延迟

  • 频繁选举

  • 节点可用性

  • 故障转移

  • Node restarts

  • 与慢速查询期同时发生的存储错误

检查每个节点上的 CPU、内存、磁盘 I/O 和磁盘利用率,确认不存在持续饱和的情况。有关详细信息,请参阅监控自管理MongoDB部署。

在Atlas上,查看指标盘,了解慢速查询前后 CPU、IOPS、连接数和页面错误方面的峰值。

确定最近是否有任何更改与慢速查询同时发生,例如:

  • 发布应用程序

  • 索引更改

  • 模式迁移

  • 部署大小调整

  • 参数更改

以下各节介绍查询缓慢的常见原因以及解决方法。

以下索引问题可能会导致查询缓慢。

执行集合扫描或使用非选择性索引的查询可能会在生产负载下导致高延迟。通过使用explain "executionStats"和 或“allPlansExecution” 选项来识别未使用预期索引的查询,从而实现高详细程度。这些选项显示评估阶段所有计划的执行指标。为用于对查询结果进行过滤和排序的字段创建或优化索引。

sort()对于无法使用索引的带有 的查询,需要进行内存中排序。这在大型结果集上尤其慢。您可以通过以下方式提高性能:

  • 创建与查询过滤和排序模式匹配的复合索引

  • 在排序前减小结果设立大小

聚合管道应尽早使用$match$sort 或其他选择性阶段来过滤数据集,并避免在内存中处理大量数据。如果您的管道有较晚的$match$sort 阶段,请尽可能将其提前。

您还可以通过对早期管道阶段使用的字段创建索引来提高性能。

以下模式和查询设计问题可能会导致查询缓慢。

非常大的文档、无界数组和高度嵌套结构会增加每次操作的 I/O 和 CPU。您可以通过识别具有异常大文档或宽数组的集合并更新模式以尽可能使用分桶或引用来提高性能。

扫描大型集合或时间范围的查询比实施严格筛选和限制的查询慢。您可以通过以下方式提高查询性能:

  • 添加选择性筛选器并对查询字段索引

  • 使用分页模式而不是大型skip()limit() 组合

  • 缩小时间序列数据的时间窗口,或者在根本的集合本身的粒度太细时进行调整。

某些查询运算符和模式会阻止MongoDB高效使用索引:

  • $regex 带有前导通配符

  • $nin

  • 非常大的$in 列表

  • 分支过多$or

  • $ne 对索引负面影响的否定方程

要提高性能,请将谓词重写为索引友好型。尽可能考虑锚定的正则表达式和预计算字段。

查询缓慢可能是由于生产负载下对根本的硬件资源的争用造成的。检查查询延迟峰值与 CPU、IOPS 和缓存利用率的指标之间是否存在相关性。如果已经优化了查询,请考虑垂直和/或水平扩展或工作负载重新分配。

长时间运行的操作可能会区块或干扰其他查询。示例:

  • 大型索引构建

  • 集合扫描

  • 大量写入

使用$currentOp 来识别阻塞或长时间运行的操作。考虑在维护窗口期间安排繁重的操作。示例,考虑在维护窗口期间对大型集合运行索引构建。

路由到存在复制延迟或硬件能力较低的从节点的查询可能会导致响应速度减慢。查看驾驶员读取偏好和写入关注。确保将延迟关键型查询定向到适当的节点。

  • 重新运行代表性查询,并将延迟与之前的结果和预期目标进行比较。

  • 确认 explain("executionStats") 显示工作量减少,例如检查的文档减少,索引使用率提高。

  • 查看分析器和慢查询日志以验证:

    • 上一个的慢速查询不再出现。

    • 查询时间和资源使用量均已减少。

  • 对于Atlas部署,请确认更改后查询和集群级别的指标已恢复正常范围。

如果需要其他支持,请收集以下信息:

  • 使用完整过滤和任何适用的投影、排序和选项对慢查询进行采样,包括:

    • 大致频率

    • 预期延迟与观察到的延迟

  • explain("executionStats") 代表性慢速查询的输出

  • 涵盖缓慢发生期间的相关日志摘录和分析器样本

  • 最近的更改:

    • 模式或索引

    • 部署大小、层级或拓扑结构

    • 应用程序发布或查询模式

  • 集群指标或主机级统计信息,显示慢速查询前后的 CPU、内存、磁盘 I/O 和连接使用情况。

  • 部署环境详情:

    • Atlas与自我管理

    • 硬件配置文件

    • 分片配置

    • 复制配置

后退

阻止慢查询

在此页面上