首頁技術(shù)文章正文

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

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

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

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

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

1.單字段索引

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

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


圖3-27單字段索引

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

2.復(fù)合索引


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

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

圖3-28復(fù)合索引

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

3.多鍵索引

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

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

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

4.地理空間索引

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

5.文本索引

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

6.哈希索引

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





猜你喜歡:

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

MongoDB下載和安裝圖文教程

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

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

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

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!