MongoDB 索引詳解(一)

  • 默認_id 索引
  • 建立索引
  • 索引類型
  • 索引屬性
  • 索引使用
  • 索引及排序規則
  • 覆蓋查詢
  • 交叉索引
  • 限制
  • 其餘注意事項

索引支持MongoDB中查詢的高效執行。若是沒有索引,MongoDB必須執行集合掃描,即掃描集合中的每一個文檔,以選擇與查詢語句匹配的文檔。若是查詢存在適當的索引,MongoDB可使用索引來限制它必須檢查的文檔數。mongodb

索引是特殊的數據結構[1],它以易於遍歷的形式存儲部分集合數據集。索引存儲特定字段或字段集的值,按字段值排序。索引條目的排序支持高效的等值匹配和基於範圍的查詢操做。此外,MongoDB可使用索引中的順序返回排序後結果。shell

下圖說明了查詢如何使用索引選擇和排序相匹配文檔:數據庫

圖片描述

從根本上說,MongoDB中的索引與其餘數據庫系統中的索引相似。MongoDB在集合級別定義索引,並支持MongoDB集合中文檔的任何字段或子字段定義索引。數組

默認_id 索引

MongoDB 在建立集合期間在_id字段上建立了惟一索引。該索引可防止客戶端插入兩個_id字段值相同的文檔。_id字段的索引不能刪除。數據結構

注意
在分片羣集中,若是不將該_id字段用做分片鍵,則應用程序必須確保_id字段值的惟一性以防止出錯。一般使用標準的自動生成的ObjectId來完成。性能

建立索引

===Mongo shell優化

使用db.collection.createIndex()spa

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

原文連接:https://docs.mongodb.com/manu...譯者:莫微DBA一枚,關注數據庫發展,願爲之添磚加瓦。

相關文章
相關標籤/搜索