mongodb执行计划Explain分析实例(转载)

转载 2016年06月01日 17:20:48

原文Explain分析实例

表中数据如下(简单测试用例,仅10条数据,主要是对explain分析的逻辑进行解析):

{ “_id” : ObjectId(“55b86d6bd7e3f4ccaaf20d70”), “a” : 1, “b” : 1, “c” : 1 }
{ “_id” : ObjectId(“55b86d6fd7e3f4ccaaf20d71”), “a” : 1, “b” : 2, “c” : 2 }
{ “_id” : ObjectId(“55b86d72d7e3f4ccaaf20d72”), “a” : 1, “b” : 3, “c” : 3 }
{ “_id” : ObjectId(“55b86d74d7e3f4ccaaf20d73”), “a” : 4, “b” : 2, “c” : 3 }
{ “_id” : ObjectId(“55b86d75d7e3f4ccaaf20d74”), “a” : 4, “b” : 2, “c” : 5 }
{ “_id” : ObjectId(“55b86d77d7e3f4ccaaf20d75”), “a” : 4, “b” : 2, “c” : 5 }
{ “_id” : ObjectId(“55b879b442bfd1a462bd8990”), “a” : 2, “b” : 1, “c” : 1 }
{ “_id” : ObjectId(“55b87fe842bfd1a462bd8991”), “a” : 1, “b” : 9, “c” : 1 }
{ “_id” : ObjectId(“55b87fe942bfd1a462bd8992”), “a” : 1, “b” : 9, “c” : 1 }
{ “_id” : ObjectId(“55b87fe942bfd1a462bd8993”), “a” : 1, “b” : 9, “c” : 1 }

查询语句:

db.d.find({a:1,b:{$lt:3}}).sort({c:-1})

首先,我们看看没有index时候的查询计划

“executionStats” : {
“executionSuccess” : true,
“nReturned” : 2,
“executionTimeMillis” : 0,
“totalKeysExamined” : 0,
“totalDocsExamined” : 10,
“executionStages” : {
“stage” : “SORT”,
“nReturned” : 2,

“sortPattern” : {
“c” : -1
},
“memUsage” : 126,
“memLimit” : 33554432,
“inputStage” : {
“stage” : “COLLSCAN”,
“filter” : {
and” : [  
                                                {  
                                                        “a” : {  
                                                                “
eq” : 1
}
},
{
“b” : {
“$lt” : 3
}
}
]
},
“nReturned” : 2,

“direction” : “forward”,
“docsExamined” : 10
}

nReturned为2,符合的条件的返回为2条。

totalKeysExamined为0,没有使用index。

totalDocsExamined为10,扫描了所有记录。

executionStages.stage为SORT,未使用index的sort,占用的内存与内存限制为”memUsage” : 126, “memLimit” : 33554432。

executionStages.inputStage.stage为COLLSCAN,全表扫描,扫描条件为

“filter” : {
and” : [  
        {  
            “a” : {  
                  “
eq” : 1
}
},
{
“b” : {
“$lt” : 3
}
}
]
},

很明显,没有index的时候,进行了全表扫描,没有使用到index,在内存中sort,很显然,和都是不可取的。
下面,我们来对sort项c加一个索引

db.d.ensureIndex({c:1})

再来看看执行计划

“executionStats” : {
“executionSuccess” : true,
“nReturned” : 2,
“executionTimeMillis” : 1,
“totalKeysExamined” : 10,
“totalDocsExamined” : 10,
“executionStages” : {
“stage” : “FETCH”,
“filter” : {
and” : [  
                                        {  
                                                “a” : {  
                                                        “
eq” : 1
}
},
{
“b” : {
“$lt” : 3
}
}
]
},
“nReturned” : 2,

“inputStage” : {
“stage” : “IXSCAN”,
“nReturned” : 10,

“keyPattern” : {
“c” : 1
},
“indexName” : “c_1”,
“isMultiKey” : false,
“direction” : “backward”,
“indexBounds” : {
“c” : [
“[MaxKey, MinKey]”
]
},

我们发现,Stage没有了SORT,因为我们sort字段有了index,但是由于查询还是没有index,故totalDocsExamined还是10,但是由于sort用了index,totalKeysExamined也是10,但是仅对sort排序做了优化,查询性能还是一样的低效。
接下来, 我们对查询条件做index(做多种index方案寻找最优)

我们的查询语句依然是:

db.d.find({a:1,b:{$lt:3}}).sort({c:-1})

使用db.d.ensureIndex({b:1,a:1,c:1})索引的执行计划:

"executionStats" : {
            "executionSuccess" : true,
            "nReturned" : 2,
            "executionTimeMillis" : 0,
            "totalKeysExamined" : 4,
            "totalDocsExamined" : 2,
            "executionStages" : {
                    "stage" : "SORT",
                    "nReturned" : 2,
                    ...
                    "sortPattern" : {
                            "c" : -1
                    },
                    "memUsage" : 126,
                    "memLimit" : 33554432,
                    "inputStage" : {
                            "stage" : "FETCH",
                            "nReturned" : 2,
                            ...
                            "inputStage" : {
                                    "stage" : "IXSCAN",
                                    "nReturned" : 2,
                                   ...
                                    "keyPattern" : {
                                            "b" : 1,
                                            "a" : 1,
                                            "c" : 1
                                    },
                                    "indexName" : "b_1_a_1_c_1",
                                    "isMultiKey" : false,
                                    "direction" : "forward",
                                    "indexBounds" : {
                                            "b" : [
                                                    "[-inf.0, 3.0)"
                                            ],
                                            "a" : [
                                                    "[1.0, 1.0]"
                                            ],
                                            "c" : [
                                                    "[MinKey, MaxKey]"
                                            ]
                                    },

我们可以看到

nReturned为2,返回2条记录

totalKeysExamined为4,扫描了4个index

totalDocsExamined为2,扫描了2个docs

此时nReturned=totalDocsExamined

相关文章推荐

第四章:mongodb 命令行操作&进程控制&性能优化

一:命令执行操作 1.通过eval 参数执行指定语句 需要查询test库的t1 表中的记录数有多少,常用方法如下: db.t1.count() 通过命令行eval参数直接执行语句: ./mon...

mongodb诊断工具explain()最新API详解

起因 说道explain()我就不得不吐槽一下被坑的经过(假设你已知晓索引相关概念) 在数据量和吞吐量越发庞大的今天,优化查询速度是提高系统性能的一个关键点,而获取这类相关信息的重要诊断工具之一就...

MongoDB性能篇 - 索引,explain执行计划,优化器profile,性能监控mongosniff

MongoDB性能篇 - 索引,explain执行计划,优化器profile,性能监控mongosniff 一、索引 MongoDB 提供了多样性的索引支持,索引信息被保存在system.index...

MongoDB性能篇 -创建索引,组合索引,唯一索引,删除索引和explain执行计划

MongoDB性能篇 -创建索引,组合索引,唯一索引,删除索引和explain执行计划 2014-08-15 14:44:17   来源:   评论:0 点击:1165 一、索引 MongoDB...

MySQL系列之五:explain执行计划分析

MySQL执行计划 (explain分析sql语句)语法explain 例如:explain select * from t3 where id=3952602; explain输出解释:+—-+—...

分析oracle的执行计划(explain plan)

基于oracle的应用系统很多性能问题,是由应用系统sql性能低劣引起的,所以,sql的性能优化很重要,分析与优化sql的性能我们一般通过查看该sql的执行计划,本文就如何看懂执行计划,以及如何通过分...

MySQL的EXPLAIN执行计划

  • 2017年06月14日 11:41
  • 772KB
  • 下载

MongoDB 性能优化:分析执行计划

前言cursor.explain("executionStats") 和 db.collection.explain("executionStats") 方法提供一个 查询的性能统计情况。这些数据输出...
  • defonds
  • defonds
  • 2016年05月11日 20:20
  • 7339

使用 EXPLAIN PLAN 获取SQL语句执行计划

SQL查询语句的性能从一定程度上影响整个数据库的性能。很多情况下,数据库性能的低下差不多都是不良SQL语句所引起。而SQL语句的执行 计划则决定了SQL语句将会采用何种方式从数据库提取数据并返回给客...

MySQL高级 之 explain执行计划详解

使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈。explain执行计划包含的信息其中最重要的字段为:id、...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mongodb执行计划Explain分析实例(转载)
举报原因:
原因补充:

(最多只允许输入30个字)