MongoDB權威指南學習筆記5---索引相關的知識點

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(...)

相關文章
相關標籤/搜索