zoukankan      html  css  js  c++  java
  • MongoDB学习笔记(五)

    MongoDB 查看执行计划

    MongoDB 中的 explain() 函数可以帮助我们查看查询相关的信息,这有助于我们快速查找到搜索瓶颈进而解决它,本文我们就来看看 explain() 的一些用法及其查询结果的含义。

    本文是 MongoDB 系列的第八篇文章,了解前面的文章有助于更好的理解本文:

    整体来说,explain() 的用法和 sort()、limit() 用法差不多,不同的是 explain() 必须放在最后面。

    基本用法

    先来看一个基本用法:

    1
    db.sang_collect.find({x:1}).explain()

    直接跟在 find() 函数后面,表示查看 find() 函数的执行计划,结果如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    {
    "queryPlanner" : {
    "plannerVersion" : 1,
    "namespace" : "sang.sang_collect",
    "indexFilterSet" : false,
    "parsedQuery" : {
    "x" : {
    "$eq" : 1.0
    }
    },
    "winningPlan" : {
    "stage" : "COLLSCAN",
    "filter" : {
    "x" : {
    "$eq" : 1.0
    }
    },
    "direction" : "forward"
    },
    "rejectedPlans" : []
    },
    "serverInfo" : {
    "host" : "localhost.localdomain",
    "port" : 27017,
    "version" : "3.4.9",
    "gitVersion" : "876ebee8c7dd0e2d992f36a848ff4dc50ee6603e"
    },
    "ok" : 1.0
    }

    返回结果包含两大块信息,一个是 queryPlanner,即查询计划,还有一个是 serverInfo,即 MongoDB 服务的一些信息。那么这里涉及到的参数比较多,我们来一一看一下:

    参数含义
    plannerVersion 查询计划版本
    namespace 要查询的集合
    indexFilterSet 是否使用索引
    parsedQuery 查询条件,此处为x=1
    winningPlan 最佳执行计划
    stage 查询方式,常见的有**COLLSCAN/全表扫描、IXSCAN/索引扫描、FETCH/根据索引去检索文档、SHARD_MERGE/合并分片结果、IDHACK/针对
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    |filter|过滤条件|
    |direction|搜索方向|
    |rejectedPlans|拒绝的执行计划|
    |serverInfo|MongoDB服务器信息|

    ## 添加不同参数

    explain() 也接收不同的参数,通过设置不同参数我们可以查看更详细的查询计划。

    ### queryPlanner

    queryPlanner 是默认参数,添加 queryPlanner 参数的查询结果就是我们上文看到的查询结果,so,这里不再赘述。

    ### executionStats

    executionStats 会返回最佳执行计划的一些统计信息,如下:

    ```json
    {
    "queryPlanner" : {
    "plannerVersion" : 1,
    "namespace" : "sang.sang_collect",
    "indexFilterSet" : false,
    "parsedQuery" : {},
    "winningPlan" : {
    "stage" : "COLLSCAN",
    "direction" : "forward"
    },
    "rejectedPlans" : []
    },
    "executionStats" : {
    "executionSuccess" : true,
    "nReturned" : 10000,
    "executionTimeMillis" : 4,
    "totalKeysExamined" : 0,
    "totalDocsExamined" : 10000,
    "executionStages" : {
    "stage" : "COLLSCAN",
    "nReturned" : 10000,
    "executionTimeMillisEstimate" : 0,
    "works" : 10002,
    "advanced" : 10000,
    "needTime" : 1,
    "needYield" : 0,
    "saveState" : 78,
    "restoreState" : 78,
    "isEOF" : 1,
    "invalidates" : 0,
    "direction" : "forward",
    "docsExamined" : 10000
    }
    },
    "serverInfo" : {
    "host" : "localhost.localdomain",
    "port" : 27017,
    "version" : "3.4.9",
    "gitVersion" : "876ebee8c7dd0e2d992f36a848ff4dc50ee6603e"
    },
    "ok" : 1.0
    }

    这里除了我们上文介绍到的一些参数之外,还多了 executionStats 参数,含义如下:

    参数含义
    executionSuccess 是否执行成功
    nReturned 返回的结果数
    executionTimeMillis 执行耗时
    totalKeysExamined 索引扫描次数
    totalDocsExamined 文档扫描次数
    executionStages 这个分类下描述执行的状态
    stage 扫描方式,具体可选值与上文的相同
    nReturned 查询结果数量
    executionTimeMillisEstimate 预估耗时
    works 工作单元数,一个查询会分解成小的工作单元
    advanced 优先返回的结果数
    docsExamined 文档检查数目,与totalDocsExamined一致

    allPlansExecution

    allPlansExecution 用来获取所有执行计划,结果参数基本与上文相同,这里就不再细说了。

    好了,MongoDB 中的 explain() 我们就说到这里,小伙伴们有问题欢迎留言讨论。

    参考资料:

    1. 《MongoDB权威指南第2版》
    2. MongoDB执行计划获取(db.collection.explain())
    3. mongodb .explain(‘executionStats’) 查询性能分析(没找到原文出处)
  • 相关阅读:
    打印杨辉三角
    插值排序
    各种冒泡排序法
    Linux系统命令符01
    2.1博客系统 |基于form组件和Ajax实现注册登录
    python面试笔试题,你都会了吗?快来复习
    1.2博客系统 |登录页| 验证码
    1.1博客系统| 表结构
    第五章:5.2面向对象-绑定方法和非绑定方法| 内置方法 |元类
    11.Django|中间件
  • 原文地址:https://www.cnblogs.com/eer123/p/11734058.html
Copyright © 2011-2022 走看看