您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關MongoDB中的索引是怎樣的,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
索引就像圖書的目錄一樣,可以讓我們快速定位到需要的內容,關系型數據庫中有索引,NoSQL中當然也有,本文我們就先來簡單介紹下MongoDB中的索引。
索引創建
默認情況下,集合中的_id
字段就是索引,我們可以通過getIndexes()方法來查看一個集合中的索引:
db.sang_collect.getIndexes()
結果如下:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "sang.sang_collect" } ]
我們看到這里只有一個索引,就是_id
。
現在我的集合中有10000個文檔,我想要查詢x為1的文檔,我的查詢操作如下:
db.sang_collect.find({x:1})
這種查詢默認情況下會做全表掃描,我們可以用上篇文章介紹的explain()來查看一下查詢計劃,如下:
db.sang_collect.find({x:1}).explain("executionStats")
結果如下:
{ "queryPlanner" : { }, "executionStats" : { "executionSuccess" : true, "nReturned" : 1, "executionTimeMillis" : 15, "totalKeysExamined" : 0, "totalDocsExamined" : 10000, "executionStages" : { "stage" : "COLLSCAN", "filter" : { "x" : { "$eq" : 1.0 } }, "nReturned" : 1, "executionTimeMillisEstimate" : 29, "works" : 10002, "advanced" : 1, "needTime" : 10000, "needYield" : 0, "saveState" : 78, "restoreState" : 78, "isEOF" : 1, "invalidates" : 0, "direction" : "forward", "docsExamined" : 10000 } }, "serverInfo" : { }, "ok" : 1.0 }
結果比較長,我摘取了關鍵的一部分。我們可以看到查詢方式是全表掃描,一共掃描了10000個文檔才查出來我要的結果。實際上我要的文檔就排第二個,但是系統不知道這個集合中一共有多少個x為1的文檔,所以會把全表掃描完,這種方式當然很低效,但是如果我加上limit,如下:
db.sang_collect.find({x:1}).limit(1)
此時再看查詢計劃發現只掃描了兩個文檔就有結果了,但是如果我要查詢x為9999的記錄,那還是得把全表掃描一遍,此時,我們就可以給該字段建立索引,索引建立方式如下:
db.sang_collect.ensureIndex({x:1})
1表示升序,-1表示降序。當我們給x字段建立索引之后,再根據x字段去查詢,速度就非常快了,我們看下面這個查詢操作的執行計劃:
db.sang_collect.find({x:9999}).explain("executionStats")
這個查詢計劃過長我就不貼出來了,我們可以重點關注查詢要耗費的時間大幅度下降。
此時調用getIndexes()方法可以看到我們剛剛創建的索引,如下:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "sang.sang_collect" }, { "v" : 2, "key" : { "x" : 1.0 }, "name" : "x_1", "ns" : "sang.sang_collect" } ]
我們看到每個索引都有一個名字,默認的索引名字為字段名_排序值
,當然我們也可以在創建索引時自定義索引名字,如下:
db.sang_collect.ensureIndex({x:1},{name:"myfirstindex"})
此時創建好的索引如下:
{ "v" : 2, "key" : { "x" : 1.0 }, "name" : "myfirstindex", "ns" : "sang.sang_collect" }
當然索引在創建的過程中還有許多其他可選參數,如下:
db.sang_collect.ensureIndex({x:1},{name:"myfirstindex",dropDups:true,background:true,unique:true,sparse:true,v:1,weights:99999})
關于這里的參數,我說一下:
1.name表示索引的名稱
2.dropDups表示創建唯一性索引時如果出現重復,則將重復的刪除,只保留第一個
3.background是否在后臺創建索引,在后臺創建索引不影響數據庫當前的操作,默認為false
4.unique是否創建唯一索引,默認false
5.sparse對文檔中不存在的字段是否不起用索引,默認false
6.v表示索引的版本號,默認為2
7.weights表示索引的權重
此時創建好的索引如下:
{ "v" : 1, "unique" : true, "key" : { "x" : 1.0 }, "name" : "myfirstindex", "ns" : "sang.sang_collect", "background" : true, "sparse" : true, "weights" : 99999.0 }
上文我們介紹了getIndexes()可以用來查看索引,我們還可以通過totalIndexSize()來查看索引的大小,如下:
db.sang_collect.totalIndexSize()
我們可以按名稱刪除索引,如下:
db.sang_collect.dropIndex("xIndex")
表示刪除一個名為xIndex的索引,當然我們也可以刪除所有索引,如下:
db.sang_collect.dropIndexes()
以上就是MongoDB中的索引是怎樣的,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。