天天看點

MongoDB(三)

一、MongoDB索引

1、索引介紹

   索引在mongodb中被支援,如果沒有索引,mongodb必須掃描每一個文檔集合選擇比對的查詢記錄。這樣掃描集合效率并不高,因為它需要mongod程序使用大量的資料作周遊操作。 索引是一種特殊的資料結構,它儲存了小部分簡單的集合資料。索引存儲了一些特殊字段,并将其排序。 

   從根本上講,索引在mongodb中和其他資料庫系統是類似的。mongodb規定了索引的集合級别、支援索引任何字段或者子字段在mongodb文檔集合中。

2、索引優化查詢方案 

要考慮資料之間的關系,做查詢優化。 

建立索引支援常見的面向使用者的查詢,確定掃描讀取檔案最小數量。 

索引可以優化特定場景中的其它業務的性能。

3、排序傳回資料

來看看一個索引的具體例子(其實就相當于我們查詢字段一樣的)

MongoDB(三)

4、索引類型

MongoDB提供了一些不同的索引類型支援的資料和查詢的具體類型

Default _id (預設_id索引) :所有mongodb預設都有一個_id字段索引,如果我們不指定_id的值會自動生成一個ObjectId值。 該_id索引是唯一的,并且可以防止用戶端對_id字段值相同插入兩個。

   注意:索引排序規則升序:1,降序-1

Single Field (單字段索引) :mongodb允許定義單個字段的索引,與default _id一樣,隻是字段不同。

Compound Index (複合索引[多字段索引]) :mongodb中可以自定多個字段的索引。例如,如果一個複合名額包括{userid:1,score:-1 },索引排序第一的使用者名後,在每一個使用者辨別符值,按得分++倒序++排序。

建立方法:

MultiKey Index (多鍵索引) 

官方文檔中給出這樣一個案例:

注意:你可以建立 多鍵複合索引(multikey compound indexes)

Geospatial Index (地理空間索引) 

db.places.ensureIndex( { loc : "2dsphere" } )

Text Indexes (文本索引) :文本索引是在2.4版本更新的,提供了文本搜尋文檔中的集合功能,文本索引包含:字元串、字元數組。使用$text做查詢操作。 2.6版本 預設情況下使文本搜尋功能。在MongoDB 2.4,你需要使文本搜尋功能手動建立全文索引和執行文本搜尋 

複合索引可以包含文本索引 稱為:複合文本索引(compound text indexes),但有限制 :

複合文本索引不能包含任何其他特殊索引類型,比如:多鍵索引(multi-key Indexes) 

如果複合文本索引包含文本索引的鍵,執行$text查詢必須相同查詢條件。可能翻譯不對原文: 

        (If the compound text index includes keys preceding the text index key, to perform a $text search, the query 

         predicate must include equality match conditions on the preceding keys1) 

Hashed Indexes (哈希碼索引) :哈希索引在2.4版本更新的,将實體的的哈希值作為索引字段, 

# 給user_scores的score字段建立一個哈希索引

db.user_scores.ensureIndex( { score: "hashed" } )

5、索引的屬性

除了衆多索引類型的支援以外,還可以使用各種屬性來調整性能。

TTL Indexes :它是一個特殊的索引,可以在某個時間自動的删除文檔集合的索引。對于一些資訊資料比如說日志、事件對象、會話資訊,隻需要存放在資料庫一個特定期限。 

使用限制:

不支援複合索引 

必須是date時間類型字段 

如果是date數組,按照最早時間過期。 

注意:TTL index不保證過期時間立即删除,,背景任務沒60秒運作删除, 依賴于mongod程序。 

Unique Indexes 

注意:如果字段為null,那麼就以null值,但不能重複插入空值。如果collection中有兩個實體唯一索引字段為空,則不能建立唯一索引

也就是說,我們還可以利用它作為類似于關系型資料庫的唯一限制。 

Sparse Indexes 

background屬性 高效修改/建立索引 :在項目運作中,如果我們直接采用前面的方法建立索引或者修改索引,那麼資料庫會阻塞建立索引期間的所有請求。mongodb提供了background屬性做背景處理。 

   我們知道如果阻塞所有請求,建立索引就會很快,但是使用系統的使用者就需要等待,影響了資料庫的操作,是以可以更具具體情況來選擇使用background屬性

6、索引名稱

7 、管理索引 

8、索引分類

Default _id (預設_id索引) 

Single Field (單字段索引) 

Compound Index (複合索引[多字段索引]) 

Text Indexes (文本索引) 

Hashed Indexes (哈希碼索引)

二、應用舉例

建立單字段索引:

建立哈希索引:

删除哈希索引:

删除單字段索引:

删除所有索引:

檢視索引是否用到:

通過建立索引可以發現在查詢時隻需要一次就行,不用在全文檔掃描:

指定索引查詢:

總結:

   前面隻是簡單的介紹了MongoDB的索引及其的使用,在查詢時我們最好可以根據建立的索引來進行查詢,這樣做可以大大節省磁盤IO的開銷。若查詢時沒有相關的索引則極可能周遊全部文檔,這樣大大降低了性能。在實際使用中建立和使用索引要做到:根據實際的需求建立最合适索引,查詢時也要使用最合适的索引。對于索引的使用前面所講的隻是一些皮毛知識,若想深入學習建議可以查閱《資料庫索引設計與優化》。