深入學習MongoDB之索引與執行計畫

2021-08-21 10:59:25 字數 3709 閱讀 1406

mongodb索引

建立索引:

db.getcollection("test").ensureindex();

或者db.getcollection("test").createindex();}},

"ok" : 1.0

}索引建立成功;

查詢索引狀態

db.getcollection("test").getindexes();[,

"name" : "_id_",

"ns" : "dev.test"},,

"name" : "name_1",

"ns" : "dev.test"}]

可以看到_id索引(預設的),和name索引

刪除索引

db.getcollection("test").dropindex();

刪除結果}},

"ok" : 1.0

}再次查詢

db.getcollection("test").getindexes();[,

"name" : "_id_",

"ns" : "dev.test"}]

索引刪除成功;

再次建立索引,並檢視執行計畫;

db.getcollection("test").ensureindex();

db.getcollection("test").find().explain();

,"plannerversion" : 1,

"namespace" : "dev.test",

"indexfilterset" : false,

"parsedquery" :

},"winningplan" : ,

"indexname" : "name_1",

"ismultikey" : false,

"isunique" : false,

"issparse" : false,

"ispartial" : false,

"indexversion" : 1,

"direction" : "forward",

"indexbounds" : }},

"rejectedplans" : }]

}},"executionstats" : ,

"indexname" : "name_1",

"ismultikey" : false,

"isunique" : false,

"issparse" : false,

"ispartial" : false,

"indexversion" : 1,

"direction" : "forward",

"indexbounds" : ,

"key***amined" : 2,

"dupstested" : 0,

"dupsdropped" : 0,

"seeninvalidated" : 0}}

}]}},

"ok" : 1.0

}"executionstats"表示執行狀態,

totalkey***amined表示用到的索引數,如果這個值為0,則說明未使用到索引,

totaldoc***amined表示掃瞄的文件書

rejectedplans代表棄用的索引,當前關於name的索引只有乙個,所以棄用所以為null,

我們新增乙個name和age的聯合索引:

db.getcollection("test").ensureindex();

在執行查詢計畫:

db.getcollection("test").find().explain("executionstats");

/* 1 */

,"plannerversion" : 1,

"namespace" : "dev.test",

"indexfilterset" : false,

"parsedquery" :

},"winningplan" : ,

"indexname" : "name_1",

"ismultikey" : false,

"isunique" : false,

"issparse" : false,

"ispartial" : false,

"indexversion" : 1,

"direction" : "forward",

"indexbounds" : }},

"rejectedplans" : [

,"indexname" : "name_1_age_1",

"ismultikey" : false,

"isunique" : false,

"issparse" : false,

"ispartial" : false,

"indexversion" : 1,

"direction" : "forward",

"indexbounds" : }}

]}]}

},"executionstats" : ,

"indexname" : "name_1",

"ismultikey" : false,

"isunique" : false,

"issparse" : false,

"ispartial" : false,

"indexversion" : 1,

"direction" : "forward",

"indexbounds" : ,

"key***amined" : 2,

"dupstested" : 0,

"dupsdropped" : 0,

"seeninvalidated" : 0}}

}]}},

"ok" : 1.0

}發現了棄用索引;

可以使用hint()指定使用的索引:

db.getcollection("test").find().hint().explain("executionstats");

必須注意的是hint欄位的順序必須和已建立的索引保持一致

一般情況下,mongodb會自動選擇索引,不需要手動hint

stage狀態分析

stage

描述collscan

全表掃瞄

ixscan

掃瞄索引

fetch

根據索引去檢索指定document

shard_merge

將各個分片返回資料進行merge

sort

表明在記憶體中進行了排序

limit

使用limit限制返回數

skip

使用skip進行跳過

idhack

針對_id進行查詢

sharding_filter

通過mongos對分片資料進行查詢

count

利用db.coll.explain().count()之類進行count運算

countscan

count不使用index進行count時的stage返回

count_scan

count使用了index進行count時的stage返回

subpla

未使用到索引的$or查詢的stage返回

text

使用全文索引進行查詢時候的stage返回

projection

限定返回字段時候stage的返回

深入學習之http

http協議是無狀態的,指的是協議對於事務處理沒有記憶能力,伺服器不知道客戶端是什麼狀態。也就是說,開啟乙個伺服器上的網頁和你之前開啟這個伺服器上的網頁之間沒有任何聯絡。http是乙個無狀態的面向連線的協議,無狀態不代表http不能保持tcp連線,更不能代表http使用的是udp協議 無連線 從 h...

深入學習android之任務與堆疊

乙個任務其實就是乙個activity的堆疊。也是使用者感知到的 乙個應用 預設情況下,乙個應用程式中的activity傾向於屬於同乙個任務。但是可以通過設定tackaffinity屬性,使不同應用程式的activity享有同乙個affinity,或者同乙個程式的activity有不同的affinit...

深入學習之淺拷貝

let foo let bar object.assign bar,foo foo.a foo.a 2 true bar.a 1 true 乍一看,好像已經實現了深拷貝的效果,對foo.a進行的操作並沒有體現在bar.a中,但是再往後看 foo.c.d foo.c.d 2 true bar.c.d ...