慢请求定位方法 本文主要介绍导致慢请求的原因和解决方案。 在相同业务场景下,架构设计和库、集合、索引等设计会影响查询性能,良好的设计可以提高查询性能,反之会出现很多慢请求(执行时间很长的语句),这些慢请求会消耗很多的系统性能。 排查思路 DDS支持在控制台上查看慢日志信息,针对慢日志中过长的操作需要从执行最慢的操作入手,逐个进行优化。 对于操作执行时长超过1s时,对应的操作可能会有问题,需要视具体情况分析。 对于操作执行时长超过10s时,则需要优化对应的操作。 说明 若存在某个聚合操作,因其比较慢,此时操作执行时长超过10s的情况属于正常现象。 分析方法 步骤 1 连接数据库。 步骤 2 针对慢查询可以通过如下命令检查其执行计划。 explain() 例如: db.test.find({"dataid" : "ae4b5769896f465c9fbd3fd2f3357637"}).explain(); db.test.find({"dataid" : "775f57c2b63e45d7b5813822dba231b4"}).explain("executionStats"); 对于查询而言,因为覆盖查询不需要读取文档,而是直接从索引中返回结果,这样的查询非常高效,所以 尽可能使用索引覆盖查询 。如果explain()的输出显示indexOnly字段为真,则说明这个查询就被一个索引覆盖。 步骤 3 执行计划解析。 1. 查看执行时间。 executionStats.executionStages.executionTimeMillisEstimate和executionStats.executionStages.inputStage. executionTimeMillisEstimate时间越短越好。 参数说明 参数名称 描述 executionStats.executionTimeMillis 执行计划选择和执行的所有时间 executionStats.executionStages.executionTimeMillisEstimate 最优执行计划的执行完成时间 executionStats.executionStages.inputStage. executionTimeMillisEstimate 最优执行计划下的子阶段执行完成时间 2. 查看扫描条数。 如下表中三个条目相同为最佳。 参数说明 参数名称 描述 executionStats. nReturned 匹配查询条件的文档数 executionStats .totalKeysExamined 索引扫描条目数 executionStats .totalDocsExamined 文档扫描条目数 3. 查看Stage状态。 性能较好的Stage状态组合如下: Fetch+IDHACK Fetch+ixscan, Limit+(Fetch+ixscan) PROJECTION+ixscan 状态说明 状态名称 描述 COLLSCAN 全表扫描 SORT 内存中进行排序 IDHACK 根据id进行查询 TEXT 全文索引 COUNTSCAN 未用索引计数 FETCH 索引扫描 LIMIT 使用Limit限制返回数 SUBPLA 未用索引的$or查询阶段 PROJECTION 使用索引计数 COUNTSCAN 使用索引计数