1. 程式人生 > >mongodb(2)mongodb提升

mongodb(2)mongodb提升

pro pac text 創建 turned 拒絕 dex per 時間

1.索引

Mongodb的大多數索引是建立在btree上,每個集合最多只能有64個索引

1)單字段索引創建

db.user.createIndex( {age: 1} ) //1表示升序,-1表示降序

db.user.createIndex( {age: 1},{"unique": true} )//唯一索引

db.person.createIndex( {age: 1} ,{spare:ture})創建稀疏索引//針對含有該字段做索引,針對不含該字段不建立索引

db.user.createIndex( {age: 1},... ,...)

參數說明:

background,Boolean,在後臺建立索引,以便建立索引時不阻止其他數據庫活動。默認值 false。

unique,Boolean,創建唯一索引。默認值 false。

name,String,指定索引的名稱。如果未指定,MongoDB會生成一個索引字段的名稱和排序順序串聯。

sparse,Boolean,對文檔中不存在的字段數據不啟用索引。默認值是 false。

v,index version,索引的版本號。

weights,document,索引權重值,數值在 1 到 99,999 之間,表示該索引相對於其他索引字段的得分權重

2)復合索引創建

db.person.createIndex( {age: 1, name: 1} )

3)刪除索引

db.user.dropIndex({age:1/-1})//移除索引

db.collection.dropIndexes();//刪除該集合的所有索引

4)索引常用的一些方法

db.user.reindex()//目的類似mysql碎片整理,減少空洞。

db.user.getIndexes()//查看索引

db.user.totalIndexSize()//查看索引所占的空間大小

5)explain()優化分析

db.user.find({age:{$gt:9990}}).explain("executionStats") //執行計劃

備註:https://docs.mongodb.com/v3.2/reference/explain-results/#queryplanner

{
    "queryPlanner" : {
        "plannerVersion" : 1,             //計劃版本
        "namespace" : "admin.user",       //庫.集合
        "indexFilterSet" : false,         //是否用到索引,false表示沒有
        "parsedQuery" : {               //解析查詢條件,即過濾條件
            "age" : {
                "$gt" : 9990
            }
        },
        "winningPlan" : {                //自動優化後的執行計劃
            "stage" : "COLLSCAN",         //掃描方式:COLLSCAN 全表掃描 ,IXSCAN 索引掃描,FETCH 根索引去檢索文檔,SHARD_MERGE 合並分片結果等,詳情見備註

            "filter" : {                  //  過濾條件
                "age" : {
                    "$gt" : 9990
                }
            },
            "direction" : "forward"         //方向forward
        },
        "rejectedPlans" : [ ]               //拒絕的執行計劃
    },
    "executionStats" : {                    //執行計劃信息
        "executionSuccess" : true,          //執行成功的狀態
        "nReturned" : 9,                    //返回結果集數目
        "executionTimeMillis" : 2,          //執行時間,毫秒
        "totalKeysExamined" : 0,            //索引掃描條目
        "totalDocsExamined" : 10004,        //文檔掃描條目
        "executionStages" : {           
            "stage" : "COLLSCAN",           //略,同queryPlanner的winningPlan
            "filter" : {
                "age" : {
                    "$gt" : 9990
                }
            },
            "nReturned" : 9,                //返回結果集數目 
            "executionTimeMillisEstimate" : 0,     //預估的執行時間,毫秒
            "works" : 10006,                //工作單元數
            "advanced" : 9,                //返回的中間結果數
            "needTime" : 9996,      
            "needYield" : 0,
            "saveState" : 78,
            "restoreState" : 78,
            "isEOF" : 1,
            "invalidates" : 0,
            "direction" : "forward",           //方向
            "docsExamined" : 10004            //文檔掃描數
        }
    },
    "serverInfo" : {
        "host" : "fatale",
        "port" : 27017,
        "version" : "3.6.7-14-g7f3489f445",
        "gitVersion" : "7f3489f445318e468be4534d7e5eedced033d9a3"
    },
    "ok" : 1
}  

備註:

stage:掃描方式可出現的參數如下

collscan,ixscan,fetch,shard_merge,sort,limit,skip,idhack,sharding_filter,count,countscan,count_scan,subpla,text,projection;

不希望看到:collscan(全表掃),sort(使用sort但是無index),skip,subpla(未用到index的$or)

希望看到的:IXSCAN 索引掃描,FETCH 根索引去檢索文檔

mongodb(2)mongodb提升