首頁技術文章正文

索引有什么作用?MongoDB中索引有幾種類型?

更新時間:2022-03-25 來源:黑馬程序員 瀏覽量:

MongoDB數(shù)據(jù)庫提供了多樣性的索引支持,因此可以提高查詢集合中文檔的效率。若是沒有索引,MongoDB數(shù)據(jù)庫必須執(zhí)行全集合掃描(即掃描集合中的每一個文檔),從而篩選出與查詢條件相匹配的文檔。這種掃描全集合的查詢效率是非常低的,尤其是在處理海量數(shù)據(jù)時,執(zhí)行查詢操作需要花費幾十秒甚至幾分鐘的時間,這無疑對網(wǎng)站的性能是非常致命的。若是執(zhí)行查詢操作時,集合中的文檔存在適當?shù)乃饕琈ongoDB就可以使用該索引限制必須檢查的文檔數(shù)量。

索引是一種特殊的數(shù)據(jù)結構,即采用B-Tree數(shù)據(jù)結構。索引是以易于遍歷讀取的形式存儲著集合中文檔的一小部分,文檔的一小部分指文檔中的特定字段或一/多組字段,并且這些字段均按照字段的值進行排序。索引項的排序支持有效的等值匹配和基于范圍的查詢操作。此外,MongoDB還可以使用索引中的排序返回排序的結果。

MongoDB的索引可以分為六種,即單字段索引、復合索引、多鍵索引、地理空間索引、全文本索引以及哈希索引,六種索引的詳細介紹,具體如下:

1.單字段索引

MongoDB支持在文檔的單個字段上創(chuàng)建用戶定義的升序/降序索引,因此被稱為單字段索引(SingleFieldIndex)。默認情況下,MongoDB中所有集合在“_id”字段上都有一個索引,當然,用戶也可以根據(jù)自己的需求添加額外索引來支持重要的查詢和操作。由于MongoDB可以從任何方向遍歷索引,因此對于單個字段索引和排序操作來說,索引項的排序順序(即升序或降序)并不重要。

下面,我們通過一張圖來介紹單字段索引,具體如圖3-27所示。


圖3-27單字段索引

從圖3-27可以看出,在集合collection中的字段score上創(chuàng)建了一個索引,并指定其為有序。若是查詢字段score為30的文檔,則可以先在索引中找到score為30的索引,然后再從真實的集合collection中找到字段score為30的文檔。因此,在單字段索引中,無論字段score為1(升序)或者-1(降序)對文檔的查詢效率均無影響。

2.復合索引


MongoDB除了支持單字段索引外,還支持復合索引。所謂復合索引,就是包含多個字段的索引,一個復合索引最多可以包含31個字段。需要注意的是,若某字段屬于哈希索引,則這時復合索引就不能包括該字段。

下面,我們通過一張圖來介紹復合索引,具體如圖3-28所示。

圖3-28復合索引

從圖3-28可以看出,復合索引是由{userid:1,score:-1}組成的,因此復合索引首先按字段userid進行升序排序,然后在每個字段userid的值內(nèi),按照score降序排序。

3.多鍵索引

若文檔中的字段為數(shù)組類型,則每個字段都是數(shù)組中的一個元素,MongoDB將會為數(shù)組中的每個元素創(chuàng)建索引,因此被稱為多鍵索引(Multikey Index)。多鍵索引允許通過匹配數(shù)組的一個或多個元素來查詢包含該數(shù)組的文檔。如果索引字段包含數(shù)組值,則MongoDB會自動確定是否創(chuàng)建多鍵索引,而無需顯式地指定創(chuàng)建多鍵索引。

下面,我們通過一張圖來介紹多鍵索引,具體如圖3-29所示。

圖3-29多鍵索引從圖3-29可以看出,集合collection中文檔字段addr是一個數(shù)組類型,數(shù)組值包含兩個元素,分別是{zip:“10036”,...}和{zip:“94301”,...}。因此,MongoDB會自動創(chuàng)建多鍵索引,即{“addr.zip”:1}。

4.地理空間索引

為了支持對地理空間坐標數(shù)據(jù)的有效查詢,MongoDB提供了兩種特殊的索引,即返回結果時使用平面幾何的二維索引(2d索引)和返回結果時使用球面幾何的二維球面索引(2dsphere索引)。其中,2d索引支持在歐幾里德平面上的計算,也支持計算球面上的距離;2dsphere索引支持球面上幾何計算的查詢,包含查詢(在一個指定多邊形內(nèi)的位置進行查詢)、交集查詢(查詢指定幾何相交的位置)和臨近查詢(如查詢離另一個點最近的點)。我們可以通過將2d索引和2dsphere索引進行相結合,從而進行高效的地理空間查詢。

5.文本索引

MongoDB提供了一種文本索引類型,支持在集合中搜索字符串內(nèi)容,即進行文本檢索查詢。文本索引不存儲特定語言的停止詞,例如“the”、“a”以及“or”等詞,而是將集合中的詞作為詞干,只存儲根詞。為了執(zhí)行文本檢索查詢,則集合上必須有一個text索引。一個集合只能擁有一個文本檢索索引,但是這個索引可以覆蓋多個字段。

6.哈希索引

為了支持基于哈希分片鍵進行分片,MongoDB提供了哈希索引類型。哈希索引是使用哈希函數(shù)來計算索引字段的哈希值,若是該索引字段的哈希值在哈希索引的范圍內(nèi),則分布的更加隨機。需要注意的是,哈希索引只支持等值匹配,不支持基于范圍的查詢。





猜你喜歡:

mysql和mongoDB有什么區(qū)別?

MongoDB下載和安裝圖文教程

python操作mongodb數(shù)據(jù)庫詳解

爬蟲數(shù)據(jù)為什么選擇Mongodb存儲?

黑馬程序員Python+大數(shù)據(jù)開發(fā)培訓

分享到:
在線咨詢 我要報名
和我們在線交談!