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