mongodb 索引詳解(二)

1.單字段索引

原文鏈接:https://docs.mongodb.com/manual/core/index-single/

 

MongoDB爲文檔集合中的任何字段提供完整的索引支持 。默認情況下,所有集合在_id字段上都有索引,應用程序和用戶可以添加其他索引以支持重要的查詢和操作。

本文檔描述了單個字段的升序/降序索引。

 

 

1.1 在單個字段上創建升序索引

如: records集合,它包含文檔如下:

 

{

  "_id": ObjectId("570c04a4ad233577f97dc459"),

  "score": 1034,

  "location": { state: "NY", city: "New York" }

}

 

在records集合的score字段上創建升序索引:

db.records.createIndex( { score: 1 } )

 

索引規範中字段的值描述了該字段的索引類型。例如,值爲1爲按對items升序排序的索引。值爲-1指定對item降序排序的索引。有關其他索引類型,請參閱 index types.。

 

如上索引支持在score字段上選擇查詢,例如:

db.records.find( { score: 2 } )

db.records.find( { score: { $gt: 10 } } )

 

1.2 嵌入式字段上創建索引

 

在嵌入文檔中的字段上創建索引,就像文檔中的索引頂級字段一樣。嵌入字段上的索引與 i索引在嵌入式文檔上不同,嵌入文檔中的索引包括索引中嵌入文檔的最大內容,直到最大的index size。相反,索引在嵌入式字段上允許使用“點符號”來表示嵌入式文檔。

 

如: records集合,它包含文檔如下:

{

  "_id": ObjectId("570c04a4ad233577f97dc459"),

  "score": 1034,

  "location": { state: "NY", city: "New York" }

}

以下操作在location.state 字段上創建索引:

db.records.createIndex( { "location.state": 1 } )

 

創建的索引將支持在字段上選擇的查詢 location.state,例如:

db.records.find( { "location.state": "CA" } )

db.records.find( { "location.city": "Albany", "location.state": "NY" } )

 

1.3 在嵌入式文檔上創建索引

在整個嵌入式文檔上創建索引。

 

如: records集合,它包含文檔如下:

{

  "_id": ObjectId("570c04a4ad233577f97dc459"),

  "score": 1034,

  "location": { state: "NY", city: "New York" }

}

該location字段是一個嵌入式文檔,包含嵌入字段 city和state。以下命令在整個location 字段上創建索引:

db.records.createIndex( { location: 1 } )

以下查詢可以使用該location字段上的索引:

db.records.find( { location: { city: "New York", state: "NY" } } )

 

注意

 

雖然查詢可以使用索引,但結果集不包括上面的示例文檔。在嵌入文檔上執行等值匹配時,字段順序事項和嵌入文檔必須完全匹配。有關查詢嵌入式文檔的更多信息,請參閱查詢嵌入式文檔。

 

其他注意事項

如果集合包含大量數據,並且您的應用程序需要能夠在構建索引時訪問數據,請考慮在後臺構建索引,如 Background Construction

 

要爲副本集構建或重建索引,請參閱 在副本集上構建索引。

 

某些驅動程序可以使用NumberLong(1)而不是 1作爲規範來指定索引。這對索引結果沒有任何影響。

 

2.複合索引

MongoDB支持複合索引,其中單個索引對集合文檔中多個字段[1]的引用。下圖說明了兩個字段的複合索引示例:

 

[1] 對於複合索引最多支持32個字段

複合索引可以支持在多個字段上匹配的查詢。

 

2.1創建複合索引

創建複合索引,使用如下語句:

db.collection.createIndex( { <field1>: <type>, <field2>: <type2>, ... } )

索引規範中字段的值描述了該字段的索引類型。例如,值爲1對item進行升序排序的索引。值爲-1對item進行降序的索引。有關其他索引類型,請參閱索引類型。

 

注意:

無法創建具有hashed索引類型的複合索引 。如果嘗試創建包含散列索引字段的複合索引,則會收到錯誤。

 

如:集合products,包含如下文檔:

{

 "_id": ObjectId(...),

 "item": "Banana",

 "category": ["food", "produce", "grocery"],

 "location": "4th Street Store",

 "stock": 4,

 "type": "cases"

}

 

在item和 stock字段上創建升序索引:

db.products.createIndex( { "item": 1, "stock": 1 } )

複合索引中列出的字段的順序很重要。索引首先按item字段值對文檔進行排序,然後對item字段的每個值按照stock字段值進行排序。有關 詳細信息,請參閱排序順序

 

除了支持在所有索引字段上匹配的查詢之外,複合索引還可以支持與索引字段的前綴匹配的查詢。也就是說,索引支持對item字段以及字段item和stock字段的查詢:

db.products.find( { item: "Banana" } )

db.products.find( { item: "Banana", stock: { $gt: 5 } } )

 

有關詳細信息,請參閱Prefixes

 

2.2 排序順序

索引以升序(1)或降序(-1)排序順序存儲對字段的引用。對於單字段索引,鍵的排序順序無關緊要,因爲MongoDB可以在任一方向上遍歷索引。但是,對於複合索引,排序順序決定索引是否可以支持排序操作。

 

Events集合包含字段username和date。應用程序可以發出返回結果的查詢,這些查詢首先按升序username值排序,然後按降序(即最近更新)date值排序,例如:

db.events.find().sort( { username: 1, date: -1 } )

或返回結果的查詢首先按降序username 值排序,然後按升序date值排序,例如:

db.events.find().sort( { username: -1, date: 1 } )

以下索引可以支持這兩種排序操作:

db.events.createIndex( { "username" : 1, "date" : -1 } )

但是,上述索引不支持按升序username值排序,然後按升序date值排序, 如下所示:

db.events.find().sort( { username: 1, date: 1 } )

有關排序順序和複合索引的詳細信息,請參閱 使用索引對查詢結果排序。

 

2.3 前綴

索引前綴是索引字段的beginning子集。例如,複合索引:

{ "item": 1, "location": 1, "stock": 1 }

索引具有以下索引前綴:

{ item: 1 }

{ item: 1, location: 1 }

對於複合索引,MongoDB可以使用索引來支持對索引前綴的查​​詢。因此,MongoDB可以在以下字段中使用索引進行查詢:

Item字段,

Item字段和location字段

Item字段和location字段和stock字段

MongoDB索引支持查詢item和 stock字段,因爲item字段對應於前綴。但是,索引在支持查詢方面效率不高,因爲僅索引item和stock。

 

但是,MongoDB無法使用索引來支持如下查詢,因爲沒有item字段,所列出的字段無法使用前綴索引:

 

Location字段,

Stock字段

Location字段和stock字段。

如果集合在在某個字段同時具有複合索引({ a: 1, b: 1 })和前綴索引({ a: 1 }),且兩個索引都沒有稀疏或唯一約束,則可以刪除前綴上的索引({ a: 1 })。當需要使用前綴索引時,MongoDB可以使用複合索引代替。

2.4 索引交集

從2.6版開始,MongoDB可以使用索引交集來完成查詢。選擇創建支持查詢或依賴索引交集,取決於系統的細節。有關詳細信息,請參見 索引交集和複合索引。

2.5其他注意事項

如果集合包含大量數據,並且您的應用程序需要能夠在構建索引時訪問數據,請考慮在後臺構建索引,如  Background Construction

 

要爲副本集構建或重建索引,請參閱  Build Indexes on Replica Sets.

 

某些驅動程序可以使用NumberLong(1)而不是 1作爲規範來指定索引。這對索引結果沒有任何影響。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章