索引爲mongoDB的查詢提供了有效的解決方案,若是沒有索引,mongodb必須的掃描文檔集中全部記錄來match查詢條件的記錄。然而這些掃描是沒有必要,並且每一次操做mongod進程會處理大量的數據。mongodb
索引是一種存儲文檔集中一部分數據集的特殊的數據結構,以便更容易的去遍歷。索引存儲了一個經過value排序具體字段或者字段集。數據庫
mongodb的索引和其餘數據庫系統的索引基本上相同。mongodb的索引在文檔集collection層面上,而且支持文檔集的任何字段或複合字段上面建索引。數組
一個合適的索引會大大減小mongoDB檢索文檔集的次數。在某些狀況下,mongoDB能夠用索引去判斷哪些記錄複合查詢條件。數據結構
下圖闡釋了一個利用索引的查詢:less
diagram of a query selecting documents using an index. MongoDB narrows the query by scanning the range of documents with values of score less than 30.ide
Tip性能
Create indexes to support common and user-facing queries. Having these indexes will ensure that MongoDB only scans the smallest possible number of documents.測試
索引也能夠優化性能在如下具體狀況:優化
排序結果集spa
mongodb能夠直接返回用索引排序文檔,不須要額外的排序階段。
Covered Results
當查詢條件規則和查詢的映僅僅包括索引字段,mongoDB將直接從索引數據裏返回結果集,不須要掃描任何文檔,不須要將文檔放入內存。這些覆蓋的查詢將會很是高效。並且,這些索引也能夠covers聚合管道的操做。
mongoDB提供了一系列的索引類型來支持具體的數據和查詢。
默認狀況,mongoDB全部的collections都有一個索引在_id字段,若是應用沒有具體爲_id字段制定一個具體的driver,mongod將會建立一個值爲ObjectID的_id字段。
_id的索引是惟一索引,不容許客戶端插入_id字段值相同的兩條記錄。
爲了補充mongoDB自定義的_id索引,mongoDB支持用戶在文檔的單個字段上面自定義索引。下圖是單一索引的說明:
Diagram of an index on the score field (ascending).
MongoDB也支持用戶在符合的字段上面自定義索引,這些複合索引和單一字段索引相似;然而,當查詢條件依賴於額外的字段,複合索引中字段的順序會有很大的影響。舉個例子來講,若是一個複合索包括{ userid: 1, score: -1 },索引首先經過userid排序,而後經過score的value排序,下圖是複合索引的說明:
Diagram of a compound index on the userid field (ascending) and the scorefield (descending). The index sorts first by the userid field and then by thescore field.
mongoDB用多鍵索引爲存儲數組內容的字段作索引,若是你的索引字段包含一個數組,MongoDB建立單獨的索引爲數組裏面的每個元素。這些多鍵索引容許查詢去選擇包含數組中某個元素或者全部元素。MongoDB自動的決定是否建立多鍵索引當索引字段中包含數組,你不須要明確的去制定多建類型。下圖爲多鍵索引的說明:
Diagram of a multikey index on the addr.zip field. The addr field contains an array of address documents. The address documents contain the zip field.
爲了有效支持地理空間座標數據的查詢,mongoDB提供了兩個特殊的索引:
2d indexes 返回結果用平面幾何 ,2sphere indexes 返回結果用球面幾何
See 2d Index Internals for a high level introduction to geospatial indexes.
MongoDB爲文檔中字符串內容提供一個測試版的文本類型的索引。這些文本索引不存儲特定語言的停頓詞 (e.g. 「the」, 「a」, 「or」) 。
See Text Indexes for more information on text indexes and search.
爲了支持基於哈希的分片,mongoDB提供了哈希索引類型。哈希索引經過字段的哈希值來檢索,這些索引有更隨機的分佈,可是不適用於對於基於範圍的查詢
惟一索引不容許索引重複索引字段值。若是要在一個已經有重複的字段上面見索引,see Drop Duplicates for index creation options.除了惟一約束,惟一索引和MongoDB的其餘索引能夠互換。
索引稀疏的屬性確保索引僅僅包含文檔集中有索引字段的的實體,索引忽略文檔中沒有索引字段的記錄。你能夠聯合稀疏索引和惟一索引來約束文檔中重複的值忽略文檔中沒有索引key的記錄。