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 执行计划Explain

Mongodb提供了一个explain命令,用来查看查询的过程,以便进行性能优化。
  • yyywyr
  • yyywyr
  • 2014年05月24日 11:10
  • 12308

MongoDB执行计划获取(db.collection.explain())

在RDBMS中,无论那种数据库,都提供了SQL剖析工具,用来解决SQL效率低下的问题。在MongoDB中,也有相应的策略来实现剖析。MongoDB提供了db.collection.explain()方...
  • robinson_0612
  • robinson_0612
  • 2016年12月08日 17:48
  • 5764

MongoDB Explain

MongoDB提供了db.collection.explain()方法, cursor.explain()方法, 和explain命令去返回查询计划信息和查询计划的执行统计信息。explain结果中呈...
  • xiaojia1100
  • xiaojia1100
  • 2016年11月15日 19:40
  • 849

MySQL高级 之 explain执行计划详解

使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈。explain执行计划包含的信息其中最重要的字段为:id、...
  • wuseyukui
  • wuseyukui
  • 2017年05月09日 22:55
  • 944

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

MongoDB性能篇 - 索引,explain执行计划,优化器profile,性能监控mongosniff 一、索引 MongoDB 提供了多样性的索引支持,索引信息被保存在system.index...
  • huwei2003
  • huwei2003
  • 2015年08月03日 14:59
  • 8929

mongodb查询计划(explain)分析

环境mongodb:3.4 robomongo:1.0.RC1explain 返回的数据执行的语句:db.urlcontents.find({ir_urltitle:{$regex:"科技"}, i...
  • u013066244
  • u013066244
  • 2017年03月01日 16:38
  • 1250

MySQL中使用explain和profile分析SQL执行计划和性能

注:上一篇博文中提到了如何定位效率比较低的sql语句,本文重在介绍如何使用explain和profile对其进行分析和改进,因为系统设计的数据表和SQL语句较少,所以此种方案不失为一种好的选择。一、e...
  • TFIAC
  • TFIAC
  • 2016年08月18日 13:42
  • 371

Mysql通过EXPLAIN 分析低效SQL 的执行计划

通过以上步骤查询到效率低的SQL 语句后,可以通过EXPLAIN 或者DESC 命令获取MySQL 如何执行SELECT 语句的信息,包括在SELECT 语句执行过程中表如何连接和连接的顺序,比 ...
  • zhang434
  • zhang434
  • 2014年03月05日 15:02
  • 723

MongoDB实战-使用EXPLAIN分析慢查询

explain优化查询的试验步骤
  • wanght89
  • wanght89
  • 2017年08月28日 13:49
  • 305

MySQL explain执行计划解读

本文我们主要介绍了MySQL性能分析以及explain的使用,包括:组合索引、慢查询分析、MYISAM和INNODB的锁定、MYSQL的事务配置项等,希望能够对您有所帮助。 1.使用explain语句...
  • xifeijian
  • xifeijian
  • 2014年03月02日 21:22
  • 51568
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mongodb执行计划Explain分析实例(转载)
举报原因:
原因补充:

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