原文鏈接:https://docs.mongodb.com/manual/indexes/
- 默認_id 索引
- 創建索引
- 索引類型
- 索引屬性
- 索引使用
- 索引及排序規則
- 覆蓋查詢
- 交叉索引
- 約束
- 其他考量
- 其他資源
索引支持MongoDB中查詢的高效執行。如果沒有索引,MongoDB必須執行集合掃描,即掃描集合中的每個文檔,以選擇與查詢語句匹配的文檔。如果查詢存在適當的索引,MongoDB可以使用索引來限制它必須檢查的文檔數。
索引是特殊的數據結構[1],它以易於遍歷的形式存儲部分集合數據集。索引存儲特定字段或字段集的值,按字段值排序。索引條目的排序支持高效的等值匹配和基於範圍的查詢操作。此外,MongoDB可以使用索引中的順序返回排序後結果。
下圖說明了查詢如何使用索引選擇和排序相匹配文檔:
從根本上說,MongoDB中的索引與其他數據庫系統中的索引類似。MongoDB在集合 級別定義索引,並支持MongoDB集合中文檔的任何字段或子字段定義索引。
-
默認_id 索引
MongoDB 在創建集合期間在_id字段上創建了唯一索引。該索引可防止客戶端插入兩個_id字段值相同的文檔。_id字段的索引不能刪除。
注意
在分片羣集中,如果不將該_id字段用作分片鍵,則應用程序必須確保_id字段值的唯一性以防止出錯。通常使用標準的自動生成的ObjectId來完成。
-
創建索引
===Mongo shell
使用db.collection.createIndex()
db.collection.createIndex( <key and index type specification>, <options> )
例如創建單個鍵上的降序索引
db.collection.createIndex( { name: -1 } )
db.collection.createIndex方法僅用於創建索引,且相同定義的索引不存在
[1] MongoDB 索引使用B-tree數據結構
-
索引類型
MongoDB提供了許多不同的索引類型來支持特定類型的數據和查詢。
單字段索引:除MongoDB定義的_id索引外,MongoDB還支持在文檔的單個字段上創建用戶定義的升序/降序索引。
對於單字段索引和排序操作,索引鍵的排序順序(即升序或降序)無關緊要,因爲MongoDB可以在任一方向上遍歷索引。
有關單字段索引的詳細信息,請參閱單字段索引和單字段索引排序。
==複合索引
MongoDB支持用戶在多個字段上定義索引,即 複合索引。
複合索引中字段的順序很重要。例如,如果複合索引爲{ userid: 1, score: -1 },則索引首先以userid字段進行排序,然後在每個userid 值以score字段進行排序。
對於複合索引和排序操作,索引鍵的排序順序(即升序或降序)可以確定索引是否可以支持排序操作。有關索引順序對複合索引中結果的影響的詳細信息,請參閱 排序順序。
==多鍵索引
MongoDB使用多鍵索引來索引存儲在數組中的內容。如果索引字段包含數組值,MongoDB會爲數組的每個元素創建單獨的索引條目。這些多鍵索引允許查詢通過匹配數組中的元素來獲取包含數組的文檔。如果索引字段包含數組值,MongoDB會自動決定是否需要創建多鍵索引; 不需要顯式指定多鍵類型。
==地理空間索引
爲了支持對地理空間座標數據的高效查詢,MongoDB提供了兩個特殊索引:返回結果時使用平面幾何的2d索引和使用球面幾何的2dphere索引。
有關地理空間索引的更多介紹,請參閱2d Index Internals。
== 文本索引
MongoDB提供了一種text索引類型,支持在集合中搜索字符串內容。這些文本索引不存儲特定於語言的停用詞(例如“the”,“a”,“or”),並且集合中的詞幹均僅存儲詞根。
== 哈希索引
爲了支持基於哈希的分片,MongoDB提供了哈希索引類型,索引字段值的哈希值。這些索引在其範圍內具有更隨機的值分佈,但僅 支持等值匹配且不支持範圍查詢。
- 索引屬性
==唯一索引
索引的唯一屬性會導致MongoDB拒絕索引字段的重複值。除了唯一約束之外,唯一索引在功能上可與其他MongoDB索引互換。
==部分索引
3.2版本的新功能。
部分索引僅索引符合特定的過濾表達式的集合中的文檔。通過索引集合中的文檔子集,部分索引具有較低的存儲要求,減少索引創建和維護的性能成本
部分索引是稀疏索引功能的超集,應該優先於稀疏索引。
==稀疏索引
索引的稀疏屬性可確保索引僅包含具有索引字段的文檔的條目。索引會跳過沒有索引字段的文檔。
將稀疏索引與唯一索引組合,以拒絕具有字段重複值的文檔,但忽略沒有索引鍵的文檔。
==TTL索引
TTL索引是MongoDB在指定時間後自動從集合中刪除文檔的特殊索引。這是某些類型的信息理想選擇,例如機器生成的事件數據,日誌和會話信息,這些信息只需要在數據庫中保存有限的時間。
請參閱通過設置TTL過期集合中的數據。
* 索引使用
索引可以提高讀操作的效率。 分析查詢性能教程提供有和沒有索引的查詢的執行統計信息的示例。
有關MongoDB如何選擇要使用的索引,請參閱查詢優化器
*索引和排序規則
3.4版本的新功能
排序規則允許用戶爲字符串比較指定特定於語言的規則,例如字母和重音標記。
===Mongo Shell
使用索引進行字符串比較,操作同時指定相同的排序規則。也就是說,如果操作指定了不同的排序規則,則具有排序規則的索引,不支持對索引字段執行字符串比較的操作。
例如,集合myColl在字符串字段category存在索引,該索引的排序規則locale 爲”fr”,即以法語進行升序排序。
db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )
以下查詢操作(指定與索引相同的排序規則)可以使用索引:
db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )
但是,以下查詢操作(默認情況下使用“簡單”二進制排序規則)無法使用索引:
db.myColl.find( { category: "cafe" } )
對於索引前綴鍵不是字符串,數組和嵌入文檔的複合索引,指定不同排序規則仍然可以使用索引前綴鍵的索引進行比較。
例如,集合myColl在數值字段score和price及字符串category上有複合索引; 使用以排序規則locale爲"fr"進行字符串比較:
db.myColl.createIndex({ score: 1, price: 1, category: 1 },{ collation: { locale: "fr" } })
以下操作使用”simple”二進制排序規則進行字符串比較,可以使用索引:
db.myColl.find( { score: 5 } ).sort( { price: 1 } )
db.myColl.find( { score: 5, price: { $gt: NumberDecimal( "10" ) } } ).sort( { price: 1 } )
以下操作使用"simple"二進制排序規則對索引category字段進行字符串比較,可以使用索引僅滿足部分查詢:score: 5
db.myColl.find( { score: 5, category: "cafe" } )
有關排序規則的詳細信息,請參閱排序規則詳情頁面。
以下索引僅支持簡單的二進制比較規則,不支持排序規則:
- 文本索引,
- 2d索引,和
- geoHaystack索引
*覆蓋查詢
當查詢標準和查詢投影僅包含索引字段,MongoDB的可以直接從索引返回結果,無需掃描的任何文檔或文檔加載到內存。這些覆蓋的查詢可以非常有效。
有關覆蓋查詢的更多信息,請參閱 覆蓋查詢。
* 交叉索引
2.6版中的新功能。
MongoDB可以使用交叉索引來完成查詢。對於指定複合查詢條件的查詢,如果一個索引可以滿足查詢條件的一部分,而另一個索引可以滿足查詢條件的另一部分,則MongoDB可以使用兩個索引的交集來完成查詢。使用複合索引還是使用索引交集更有效取決於具體的查詢和系統。
有關索引交集的詳細信息,請參見索引交點。
*限制
某些限制適用於索引,例如索引鍵的長度或每個集合的索引數。有關詳細信息,請參閱索引限制
*其他注意事項
雖然索引可以提高查詢性能,但索引也提出了一些操作注意事項 有關詳細信息,請參閱索引的操作注意事項。
如果您的集合包含大量數據,並且您的應用程序需要能夠在創建索引時訪問數據,請考慮在後臺構建索引
某些驅動程序可以使用NumberLong(1)而不是 1作爲條件來指定索引。這對索引結果沒有任何影響。