1 查看查詢計劃 mongodb
db.user.find({"username":"xxx"}) .explain() 數據庫
db.doc.find({"es_y":"2014"}).explain()
{
"cursor" : "BasicCursor",
"isMultiKey" : false,
"n" : 0,
"nscannedObjects" : 1,
"nscanned" : 1,
"nscannedObjectsAllPlans" : 1,
"nscannedAllPlans" : 1,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"server" : "idc254:27017",
"filterSet" : false
} 數組
-------- 服務器
indexOnly---代表是否只用索引就能夠返回所需的字段,而不是二次根據地址取文檔!也就是覆蓋索引! ui
cursor代表是否用了索引 spa
nscanned server
要分2部分解釋:若是使用了索引,是掃描的索引條目;不然就是掃描的文檔總數 排序
nscannedObjects---mongodb完成這個查詢掃描的文檔總數。 索引
isMultiKye---是否使用了多鍵索引 ip
millis顯示的是這個查詢耗費的毫秒數。
n顯示了查詢結果的數量。
scanAndOrder---代表是否須要在內存中排序!
nYields---爲了讓寫入請求可以順利執行,本次查詢暫停的次數!
2 創建索引
db.user.ensureIndex({"username":1})
3 查詢某個集合的全部索引
db.doc.getIndexes()
4 查看當前服務器的操做
db.currentOp()
{
"inprog" : [
{
"opid" : 486,
"active" : true,
"secs_running" : 2,
"op" : "getmore",
"ns" : "local.oplog.rs",
"query" : {
},
"client" : "192.168.56.66:37299",
"desc" : "conn2",
"threadId" : "0x7f1e191d7700",
"connectionId" : 2,
"waitingForLock" : false,
"numYields" : 0,
"lockStats" : {
"timeLockedMicros" : {
"r" : NumberLong(89),
"w" : NumberLong(0)
},
"timeAcquiringMicros" : {
"r" : NumberLong(15),
"w" : NumberLong(0)
}
}
}
]
}
5 關於索引
對於寫操做時間慢,一個集合最多64個索引,一般不要超過2個以上的索引個數!
6 建立複合索引
db.user.ensureIndex({"key1":1,"key2":1})
7 內存排序
若是須要在內存中排序,且超過32MB.
就會報錯!
8 強制指定索引進行查詢
.hint({索引。。。})
9覆蓋索引
簡單來講,就是索引的字段已經能夠知足需求,不須要再二次根據地址取文檔!
10隱式索引
好比說 {"age":1,"username":1}能夠當作{"age":1}來使用!
11 一個索引中的數組字段最多隻能有1個
這是爲了防止索引爆炸!
另外對數組創建索引,其實是對數組中的每一個元素創建索引!而不是對數組自己創建索引!
12 多鍵索引
其實就是說索引的某個key是一個數組
多鍵索引沒法轉換成非多鍵索引,即使文檔都已經刪除,只有刪除索引從新創建才能夠!
13關於複合索引
通常來講,前面的應該是基數比較大的鍵,後面依次下降
由於這樣的話,第一個鍵就能夠大量減小文檔數量!
14 強制全表掃描
.hint({"$natural":1})
15 建立惟一索引
db.user.ensureIndex({"username":1},{"unique":true})
超過8KB的鍵不會受到惟一索引的約束
16 建立複合惟一索引
你懂的,不解釋!
-------------------------
廣告時間:日子真TM苦逼,生病了還要看書,
就爲了多賺兩毛5分錢!、
------------------------
17 針對惟一索引,又想添加劇復的鍵
db.user.ensureIndex({"username":1},{"unique":true,"dropDups":true})18 惟一索引與null
若是是惟一索引,則他會把null看作是一個值且必須惟一。
若是你想改變這個狀況,能夠用下面的方式:
19 稀疏索引
db.ensureIndex({"email":1}, {"unique":true,"sparse":true})
意思是說,不存在也就罷了,存在必定要惟一,包括null!
注意,若是某個文檔沒有email字段,而又創建了稀疏索引
則這個文檔不會在索引中存在,則你搜索的時候,是不會搜到這個文檔的
mongoDB怎麼這麼多變態的東西!真是個大坑!
20 索引管理
全部的數據庫索引信息都存儲在system.indexes集合裏。
這是一個保留集合,不能對其進行增長修改刪除,只能經過
ensureIndex和dropIndexes進行操做!
dropIndex(...)