本页介绍查询缓慢的常见原因和解决方法。如果在完成以下部分后需要其他支持,联系 技术支持。
先决条件检查
要确认您的部署是否遇到慢速查询问题,请检查以下内容:
确认慢速查询
要确认查询实际上很慢,请将当前查询延迟与历史基线或服务级别目标进行比较。确定缓慢是持续存在的还是在特定负载模式下发生的,例如负载峰值、批处理作业或维护窗口。
识别慢速查询
使用数据库分析器和慢速查询日志,按命名空间、模式和延迟来识别特定操作。
对于Atlas,使用 Performance Advisor和查询分析器查找执行时间较长的查询。
检查部署运行状况
确认集群和节点的运行状况。检查以下方面是否存在问题:
主节点/从节点(secondary node from replica set)状态
复制延迟
频繁选举
节点可用性
故障转移
Node restarts
与慢速查询期同时发生的存储错误
检查资源利用率
检查每个节点上的 CPU、内存、磁盘 I/O 和磁盘利用率,确认不存在持续饱和的情况。有关详细信息,请参阅监控自管理MongoDB部署。
确认最近的更改
确定最近是否有任何更改与慢速查询同时发生,例如:
发布应用程序
索引更改
模式迁移
部署大小调整
参数更改
常见问题和解决方案
以下各节介绍查询缓慢的常见原因以及解决方法。
索引问题
以下索引问题可能会导致查询缓慢。
缺失或次优索引
执行集合扫描或使用非选择性索引的查询可能会在生产负载下导致高延迟。通过使用explain "executionStats"和 或“allPlansExecution” 选项来识别未使用预期索引的查询,从而实现高详细程度。这些选项显示评估阶段所有计划的执行指标。为用于对查询结果进行过滤和排序的字段创建或优化索引。
在不支持索引的情况下排序
sort()对于无法使用索引的带有 的查询,需要进行内存中排序。这在大型结果集上尤其慢。您可以通过以下方式提高性能:
聚合管道效率低下
聚合管道应尽早使用$match 、$sort 或其他选择性阶段来过滤数据集,并避免在内存中处理大量数据。如果您的管道有较晚的$match 或$sort 阶段,请尽可能将其提前。
您还可以通过对早期管道阶段使用的字段创建索引来提高性能。
模式和查询设计问题
以下模式和查询设计问题可能会导致查询缓慢。
模式和文档大小问题
非常大的文档、无界数组和高度嵌套结构会增加每次操作的 I/O 和 CPU。您可以通过识别具有异常大文档或宽数组的集合并更新模式以尽可能使用分桶或引用来提高性能。
无界查询和集合扫描
扫描大型集合或时间范围的查询比实施严格筛选和限制的查询慢。您可以通过以下方式提高查询性能:
低效的查询操作符或模式
某些查询运算符和模式会阻止MongoDB高效使用索引:
资源饱和
查询缓慢可能是由于生产负载下对根本的硬件资源的争用造成的。检查查询延迟峰值与 CPU、IOPS 和缓存利用率的指标之间是否存在相关性。如果已经优化了查询,请考虑垂直和/或水平扩展或工作负载重新分配。
争用工作负载和并发问题
长时间运行的操作可能会区块或干扰其他查询。示例:
大型索引构建
集合扫描
大量写入
使用$currentOp 来识别阻塞或长时间运行的操作。考虑在维护窗口期间安排繁重的操作。示例,考虑在维护窗口期间对大型集合运行索引构建。
拓扑或读取偏好配置错误
路由到存在复制延迟或硬件能力较低的从节点的查询可能会导致响应速度减慢。查看驾驶员读取偏好和写入关注。确保将延迟关键型查询定向到适当的节点。
验证分辨率
重新运行代表性查询,并将延迟与之前的结果和预期目标进行比较。
确认
explain("executionStats")显示工作量减少,例如检查的文档减少,索引使用率提高。查看分析器和慢查询日志以验证:
上一个的慢速查询不再出现。
查询时间和资源使用量均已减少。
对于Atlas部署,请确认更改后查询和集群级别的指标已恢复正常范围。
收集其他诊断以支持MongoDB
如果需要其他支持,请收集以下信息:
使用完整过滤和任何适用的投影、排序和选项对慢查询进行采样,包括:
大致频率
预期延迟与观察到的延迟
explain("executionStats")代表性慢速查询的输出涵盖缓慢发生期间的相关日志摘录和分析器样本
最近的更改:
模式或索引
部署大小、层级或拓扑结构
应用程序发布或查询模式
集群指标或主机级统计信息,显示慢速查询前后的 CPU、内存、磁盘 I/O 和连接使用情况。
部署环境详情:
Atlas与自我管理
硬件配置文件
分片配置
复制配置