【趙強老師】MongoDB中的索引(上)

索引是提升查詢查詢效率最有效的手段。索引是一種特殊的數據結構,索引以易於遍歷的形式存儲了數據的部份內容(如:一個特定的字段或一組字段值),索引會按必定規則對存儲值進行排序,並且索引的存儲位置在內存中,所在從索引中檢索數據會很是快。若是沒有索引,MongoDB必須掃描集合中的每個文檔,這種掃描的效率很是低,尤爲是在數據量較大時。數據庫

1、索引的基礎知識

下面以關係型數據庫Oracle爲例,介紹索引的基本原理,以下圖所示:數組

從上圖能夠當作,索引的本質其實就至關因而一本書的目錄。當查詢表中數據的時候,先查詢目錄(索引)中的行地址,再經過行地址查詢到表中的數據,從而提升查詢的性能。數據結構

下圖說明了在MongoDB中,索引在查詢和排序中是如何工做的?性能

經過這個例子,能夠清楚的看到索引存儲的是一個特定字段或者幾個字段的集合,而且按照必定的規律排序。當建立集合的時候,MongoDB自動在\_id上建立一個惟一性索引,因爲是惟一性的,因此能夠防止重複的\_id值插入到集合中。經過getIndexes能夠查詢到MongoDB集合上的索引信息,以下圖所示。spa

當沒有索引的時候,經過查看執行計劃,能夠看到查詢的過程,以下:查詢:10號部門,工資小於3000的文檔。code

那麼如何建立一個簡單的索引呢?注意從mongoDB 3.0開始ensureIndex被廢棄,從此都僅僅是db.collection.createIndex的一個別名。blog

如今在deptno和sal上創建一個索引,並從新查看執行計劃:db.emp.createIndex({"deptno":1,"sal":-1})排序

注意:除了能夠使用explain()生成執行計劃外,還能夠有幾個可選的參數,以下:
.explain("allPlansExecution")
.explain("executionStats")
.explain("queryPlanner")索引

2、索引的類型一:單鍵索引(Single Field)

單鍵索引是最普通的索引,與_id索引不一樣,單鍵索引不會自動建立。ip

準備數據:
db.testindex1.insert({"_id":1,"zipcode":1034,"location":{state:"NY",city:"New York"}})

在單個列上建立單鍵索引:
db.testindex1.createIndex({"zipcode":1})

在嵌套的列上建立單鍵索引
db.testindex1.createIndex({"location:state":1})

在內嵌的文檔上建立單鍵索引
db.testindex1.createIndex({"location":-1})
這樣將會把location做爲一個總體。

3、索引的類型二:多鍵索引(Multikey Index)

多鍵索引與單鍵索引建立形式相同,區別在於字段的值。值具備多個記錄,如數組。

如上圖,基於集合上的數組建立多鍵索引,且數組爲內嵌文檔。

準備數據:
db.testindex2.insertMany([
{ _id: 5, type: "food", item: "aaa", ratings: [ 5, 8, 9 ] },
{ _id: 6, type: "food", item: "bbb", ratings: [ 5, 9 ] },
{ _id: 7, type: "food", item: "ccc", ratings: [ 9, 5, 8 ] },
{ _id: 8, type: "food", item: "ddd", ratings: [ 9, 5 ] },
{ _id: 9, type: "food", item: "eee", ratings: [ 5, 9, 5 ] }])

下面基於ratings列建立一個多鍵索引:
db.testindex2.createIndex( { ratings: 1 } )

查詢數組上爲5,9的文檔
db.testindex2.find( { ratings: [ 5, 9 ] } )

下面查看其執行計劃
db.testindex2.find( { ratings: [ 5, 9 ] } ).explain()

相關文章
相關標籤/搜索