mongodb 索引詳解(二)

1. 單字段索引

MongoDB爲文檔集合中的任何字段提供完整的索引支持 。默認狀況下,全部集合在_id字段上都有索引,應用程序和用戶能夠添加其餘索引以支持重要的查詢和操做。mongodb

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

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

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

{
  "_id": ObjectId("570c04a4ad233577f97dc459"),
  "score": 1034,
  "location": { state: "NY", city: "New York" }
}

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

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

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

如上索引支持在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 字段上建立索引:ci

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" } } )

注意

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

1.4 其餘注意事項

若是集合包含大量數據,而且您的應用程序須要可以在構建索引時訪問數據,請考慮在後臺構建索引,如 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 } } )

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做爲規範來指定索引。這對索引結果沒有任何影響。

譯者:莫微DBA一枚,關注數據庫發展,願爲之添磚加瓦。

相關文章
相關標籤/搜索