文档数据库服务 DDS-慢请求定位方法:分析方法

时间:2024-08-27 15:57:08

分析方法

  1. 连接数据库。

  2. 针对慢查询可以通过如下命令检查其执行计划。

    explain()

    例如:

    db.test.find({"data_id" : "ae4b5769-896f-465c-9fbd-3fd2f3357637"}).explain();
    db.test.find({"data_id" : "775f57c2-b63e-45d7-b581-3822dba231b4"}).explain("executionStats");

    对于查询而言,因为覆盖查询不需要读取文档,而是直接从索引中返回结果,这样的查询非常高效,所以尽可能使用索引覆盖查询。如果explain()的输出显示indexOnly字段为真,则说明这个查询就被一个索引覆盖。

  3. 执行计划解析。

    1. 查看执行时间。

      executionStats.executionStages.executionTimeMillisEstimate和executionStats.executionStages.inputStage. executionTimeMillisEstimate时间越短越好。

      表1 参数说明

      参数名称

      描述

      executionStats.executionTimeMillis

      执行计划选择和执行的所有时间

      executionStats.executionStages.executionTimeMillisEstimate

      执行计划的执行完成时间

      executionStats.executionStages.inputStage. executionTimeMillisEstimate

      执行计划下的子阶段执行完成时间

    2. 查看扫描条数。

      表2中三个条目相同为最佳。

      表2 参数说明

      参数名称

      描述

      executionStats. nReturned

      匹配查询条件的文档数

      executionStats .totalKeysExamined

      索引扫描条目数

      executionStats .totalDocsExamined

      文档扫描条目数

    3. 查看Stage状态。
      性能较好的Stage状态组合如下:
      • Fetch+IDHACK
      • Fetch+ixscan,
      • Limit+(Fetch+ixscan)
      • PROJECTION+ixscan
      表3 状态说明

      状态名称

      描述

      COLLSCAN

      全表扫描

      SORT

      内存中进行排序

      IDHACK

      根据_id进行查询

      TEXT

      全文索引

      COUNTSCAN

      未用索引计数

      FETCH

      索引扫描

      LIMIT

      使用Limit限制返回数

      SUBPLA

      未用索引的$or查询阶段

      PROJECTION

      使用索引计数

      COUNT_SCAN

      使用索引计数

support.huaweicloud.com/usermanual-dds/dds_01_0059.html