【MongoDB】索引之複合索引

本章內容:

  • 創建複合索引
  • 排序
  • 前綴
  • 索引交集
  • 其他注意事項

MongoDB支持複合索引(compound indexes),一個複合索引包含對集合文檔中多個字段[1]的引用。下圖說明了兩個字段上的複合索引的示例:

在userid字段(升序)和score字段(降序)上的複合索引。索引首先按userid字段排序,然後按score字段排序。
在userid字段(升序)和score字段(降序)上的複合索引。索引首先按userid字段排序,然後按score字段排序。

 

[1] MongoDB的複合索引限制在32個字段以內。

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

 

一、創建複合索引

要創建複合索引,可以使用如下的操作模版:

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

在索引規範中,該字段的值描述了字段的索引類型。例如,值1指定一個索引,該索引按升序對記錄條目進行排序。值-1指定一個索引,該索引按降序對記錄條目進行排序。有關其他索引類型,請參見索引類型

重要

不能創建具有哈希索引類型的複合索引。如果嘗試創建包含哈希索引字段的複合索引,則會收到錯誤消息。

考慮一個叫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 } } )

有關詳細信息,請參見前綴

 

二、排序

索引以升序(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 } )

有關排序順序和複合索引的更多信息,請參見使用索引對查詢結果進行排序

 

三、索引前綴

索引前綴是索引字段的起始子集。例如,考慮以下複合索引:

{ "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.6版開始,MongoDB可以使用索引交集來完成查詢。 創建支持查詢的複合索引還是依賴索引交集之間的選擇取決於系統的具體情況。 有關更多詳細信息,請參見索引交集和複合索引

 

五、其他注意事項

參考上篇《單字段索引》的【五、其他注意事項】。

上一篇:單字段索引

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