二,mogodb索引

来源:互联网 发布:网页ui界面设计软件 编辑:程序博客网 时间:2024/05/16 03:52
1.explain()说明

explain()是MongoDB的一个重要的查询论断工具,这个函数能够提供大量的与查询相关的信息,该函数会返回查询计划、执行状态、服务器信息,根据这些信息可以有针对性的对性能进行优化。MongoDB 3.0之后,explain的返回与使用方法与之前版本有了不少变化,介于3.0之后的优秀特色,本文仅针对MongoDB 3.0+的explain进行讨论。

现版本explain有三种模式,分别如下:

queryPlanner

  • executionStats
  • allPlansExecution
  • ​queryPlanner是现版本explain的默认模式,queryPlanner模式下并不会去真正进行query语句查询,而是针对query语句进行执行计划分析并选出winning plan。
 db.kucun.find({"serialid":25}).explain(){        "queryPlanner" : {                "plannerVersion" : 1,                "namespace" : "irectoryperdb.kucun",                "indexFilterSet" : false,                "parsedQuery" : {                        "serialid" : {                                "$eq" : 25                        }                },                "winningPlan" : {                        "stage" : "COLLSCAN",                        "filter" : {                                "serialid" : {                                        "$eq" : 25                                }                        },                        "direction" : "forward"                },                "rejectedPlans" : [ ]        },        "serverInfo" : {                "host" : "app205",                "port" : 27018,                "version" : "3.2.9",                "gitVersion" : "22ec9e93b40c85fc7cae7d56e7d6a02fd811088c"        },        "ok" : 1}


explain.queryPlanner: queryPlanner的返回

explain.queryPlanner.namespace:该值返回的是该query所查询的表

explain.queryPlanner.indexFilterSet:针对该query是否有indexfilter

explain.queryPlanner.winningPlan:查询优化器针对该query所返回的最优执行计划的详细内容。

explain.queryPlanner.winningPlan.stage:最优执行计划的stage,这里返回是FETCH,可以理解为通过返回的index位置去检索具体的文档(stage有数个模式,将在后文中进行详解)。

Explain.queryPlanner.winningPlan.inputStage:用来描述子stage,并且为其父stage提供文档和索引关键字。

explain.queryPlanner.winningPlan.stagechild stage,此处是IXSCAN,表示进行的是index scanning

explain.queryPlanner.winningPlan.keyPattern:所扫描的index内容,此处是did:1,status:1,modify_time: -1与scid : 1

explain.queryPlanner.winningPlan.indexName:winning plan所选用的index

explain.queryPlanner.winningPlan.isMultiKey是否是Multikey,此处返回是false,如果索引建立在array上,此处将是true

explain.queryPlanner.winningPlan.direction:此query的查询顺序,此处是forward,如果用了.sort({modify_time:-1})将显示backward

explain.queryPlanner.winningPlan.indexBounds:winningplan所扫描的索引范围,如果没有制定范围就是[MaxKey, MinKey],这主要是直接定位到mongodbchunck中去查找数据,加快数据读取。

explain.queryPlanner.rejectedPlans:其他执行计划(非最优而被查询优化器reject的)的详细返回,其中具体信息与winningPlan的返回中意义相同,故不在此赘述。



stage的类型的意义

mongodb的文档中列出了前4种类型,还有一些没有列出来,但是会比较常见,这里一并解释一下。

COLLSCAN :全表扫描

IXSCAN:索引扫描

FETCH:根据索引去检索指定document

SHARD_MERGE:各个分片返回数据进行merge

SORT:表明在内存中进行了排序(与前期版本的scanAndOrder:true一致)

SORT_MERGE:表明在内存中进行了排序后再合并

LIMIT:使用limit限制返回数

SKIP:使用skip进行跳过

IDHACK:针对_id进行查询

SHARDING_FILTER:通过mongos对分片数据进行查询

COUNT:利用db.coll.count()之类进行count运算

COUNTSCAN:count不使用用Index进行count时的stage返回

COUNT_SCAN:count使用了Index进行count时的stage返回

SUBPLA:未使用到索引的$or查询的stage返回

TEXT:使用全文索引进行查询时候的stage返回


2.查看索引
db.index_test.getIndexes()
3.建立索引

从3.0版本后使用 db.collection.createIndex()代替db.collection.ensureIndex()

语法:db.collection.createIndex(keys, options)

参数说明:
1. keys: {字段名1:ascending,… 字段名n:ascending}: ascending 设为1 标识索引升序,-1降序
2. options : 设置索引选项,如设置名称、设置成为唯一索引


0 0