更新時(shí)間:2022-03-25 來(lái)源:黑馬程序員 瀏覽量:
MongoDB數(shù)據(jù)庫(kù)提供了多樣性的索引支持,因此可以提高查詢(xún)集合中文檔的效率。若是沒(méi)有索引,MongoDB數(shù)據(jù)庫(kù)必須執(zhí)行全集合掃描(即掃描集合中的每一個(gè)文檔),從而篩選出與查詢(xún)條件相匹配的文檔。這種掃描全集合的查詢(xún)效率是非常低的,尤其是在處理海量數(shù)據(jù)時(shí),執(zhí)行查詢(xún)操作需要花費(fèi)幾十秒甚至幾分鐘的時(shí)間,這無(wú)疑對(duì)網(wǎng)站的性能是非常致命的。若是執(zhí)行查詢(xún)操作時(shí),集合中的文檔存在適當(dāng)?shù)乃饕琈ongoDB就可以使用該索引限制必須檢查的文檔數(shù)量。
索引是一種特殊的數(shù)據(jù)結(jié)構(gòu),即采用B-Tree數(shù)據(jù)結(jié)構(gòu)。索引是以易于遍歷讀取的形式存儲(chǔ)著集合中文檔的一小部分,文檔的一小部分指文檔中的特定字段或一/多組字段,并且這些字段均按照字段的值進(jìn)行排序。索引項(xiàng)的排序支持有效的等值匹配和基于范圍的查詢(xún)操作。此外,MongoDB還可以使用索引中的排序返回排序的結(jié)果。
MongoDB的索引可以分為六種,即單字段索引、復(fù)合索引、多鍵索引、地理空間索引、全文本索引以及哈希索引,六種索引的詳細(xì)介紹,具體如下:
MongoDB支持在文檔的單個(gè)字段上創(chuàng)建用戶(hù)定義的升序/降序索引,因此被稱(chēng)為單字段索引(SingleFieldIndex)。默認(rèn)情況下,MongoDB中所有集合在“_id”字段上都有一個(gè)索引,當(dāng)然,用戶(hù)也可以根據(jù)自己的需求添加額外索引來(lái)支持重要的查詢(xún)和操作。由于MongoDB可以從任何方向遍歷索引,因此對(duì)于單個(gè)字段索引和排序操作來(lái)說(shuō),索引項(xiàng)的排序順序(即升序或降序)并不重要。
下面,我們通過(guò)一張圖來(lái)介紹單字段索引,具體如圖3-27所示。
圖3-27單字段索引
從圖3-27可以看出,在集合collection中的字段score上創(chuàng)建了一個(gè)索引,并指定其為有序。若是查詢(xún)字段score為30的文檔,則可以先在索引中找到score為30的索引,然后再?gòu)恼鎸?shí)的集合collection中找到字段score為30的文檔。因此,在單字段索引中,無(wú)論字段score為1(升序)或者-1(降序)對(duì)文檔的查詢(xún)效率均無(wú)影響。
下面,我們通過(guò)一張圖來(lái)介紹復(fù)合索引,具體如圖3-28所示。
圖3-28復(fù)合索引
從圖3-28可以看出,復(fù)合索引是由{userid:1,score:-1}組成的,因此復(fù)合索引首先按字段userid進(jìn)行升序排序,然后在每個(gè)字段userid的值內(nèi),按照score降序排序。
若文檔中的字段為數(shù)組類(lèi)型,則每個(gè)字段都是數(shù)組中的一個(gè)元素,MongoDB將會(huì)為數(shù)組中的每個(gè)元素創(chuàng)建索引,因此被稱(chēng)為多鍵索引(Multikey Index)。多鍵索引允許通過(guò)匹配數(shù)組的一個(gè)或多個(gè)元素來(lái)查詢(xún)包含該數(shù)組的文檔。如果索引字段包含數(shù)組值,則MongoDB會(huì)自動(dòng)確定是否創(chuàng)建多鍵索引,而無(wú)需顯式地指定創(chuàng)建多鍵索引。
下面,我們通過(guò)一張圖來(lái)介紹多鍵索引,具體如圖3-29所示。
圖3-29多鍵索引從圖3-29可以看出,集合collection中文檔字段addr是一個(gè)數(shù)組類(lèi)型,數(shù)組值包含兩個(gè)元素,分別是{zip:“10036”,...}和{zip:“94301”,...}。因此,MongoDB會(huì)自動(dòng)創(chuàng)建多鍵索引,即{“addr.zip”:1}。
為了支持對(duì)地理空間坐標(biāo)數(shù)據(jù)的有效查詢(xún),MongoDB提供了兩種特殊的索引,即返回結(jié)果時(shí)使用平面幾何的二維索引(2d索引)和返回結(jié)果時(shí)使用球面幾何的二維球面索引(2dsphere索引)。其中,2d索引支持在歐幾里德平面上的計(jì)算,也支持計(jì)算球面上的距離;2dsphere索引支持球面上幾何計(jì)算的查詢(xún),包含查詢(xún)(在一個(gè)指定多邊形內(nèi)的位置進(jìn)行查詢(xún))、交集查詢(xún)(查詢(xún)指定幾何相交的位置)和臨近查詢(xún)(如查詢(xún)離另一個(gè)點(diǎn)最近的點(diǎn))。我們可以通過(guò)將2d索引和2dsphere索引進(jìn)行相結(jié)合,從而進(jìn)行高效的地理空間查詢(xún)。
MongoDB提供了一種文本索引類(lèi)型,支持在集合中搜索字符串內(nèi)容,即進(jìn)行文本檢索查詢(xún)。文本索引不存儲(chǔ)特定語(yǔ)言的停止詞,例如“the”、“a”以及“or”等詞,而是將集合中的詞作為詞干,只存儲(chǔ)根詞。為了執(zhí)行文本檢索查詢(xún),則集合上必須有一個(gè)text索引。一個(gè)集合只能擁有一個(gè)文本檢索索引,但是這個(gè)索引可以覆蓋多個(gè)字段。
為了支持基于哈希分片鍵進(jìn)行分片,MongoDB提供了哈希索引類(lèi)型。哈希索引是使用哈希函數(shù)來(lái)計(jì)算索引字段的哈希值,若是該索引字段的哈希值在哈希索引的范圍內(nèi),則分布的更加隨機(jī)。需要注意的是,哈希索引只支持等值匹配,不支持基于范圍的查詢(xún)。
猜你喜歡:
python操作mongodb數(shù)據(jù)庫(kù)詳解