溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

mongodb的索引種類

發(fā)布時(shí)間:2020-08-24 10:43:33 來(lái)源:億速云 閱讀:472 作者:Leah 欄目:編程語(yǔ)言

這篇文章將為大家詳細(xì)講解有關(guān)mongodb的索引種類,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

MongoDB索引類型

MongoDB支持多種類型的索引,包括單字段索引、復(fù)合索引、多key索引、文本索引等,每種類型的索引有不同的使用場(chǎng)合。

單字段索引 (Single Field Index)

db.person.createIndex( {age: 1} )

上述語(yǔ)句針對(duì)age創(chuàng)建了單字段索引,其能加速對(duì)age字段的各種查詢請(qǐng)求,是最常見(jiàn)的索引形式,MongoDB默認(rèn)創(chuàng)建的id索引也是這種類型。

{age: 1} 代表升序索引,也可以通過(guò){age: -1}來(lái)指定降序索引,對(duì)于單字段索引,升序/降序效果是一樣的。

復(fù)合索引 (Compound Index)

復(fù)合索引是Single Field Index的升級(jí)版本,它針對(duì)多個(gè)字段聯(lián)合創(chuàng)建索引,先按第一個(gè)字段排序,第一個(gè)字段相同的文檔按第二個(gè)字段排序,依次類推,如下針對(duì)age, name這2個(gè)字段創(chuàng)建一個(gè)復(fù)合索引。

db.person.createIndex( {age: 1, name: 1} )

上述索引對(duì)應(yīng)的數(shù)據(jù)組織類似下表,與{age: 1}索引不同的時(shí),當(dāng)age字段相同時(shí),在根據(jù)name字段進(jìn)行排序,所以pos5對(duì)應(yīng)的文檔排在pos3之前。

AGE,NAME                                      位置信息

18,adam                                             pos5

18,jack                                                pos3

19,jack                                                pos1

20,rose                                                pos2

21,tony                                                pos4

復(fù)合索引能滿足的查詢場(chǎng)景比單字段索引更豐富,不光能滿足多個(gè)字段組合起來(lái)的查詢,比如db.person.find( {age: 18, name: "jack"} ),也能滿足所以能匹配符合索引前綴的查詢,這里{age: 1}即為{age: 1, name: 1}的前綴,所以類似db.person.find( {age: 18} )的查詢也能通過(guò)該索引來(lái)加速;但db.person.find( {name: "jack"} )則無(wú)法使用該復(fù)合索引。如果經(jīng)常需要根據(jù)『name字段』以及『name和age字段組合』來(lái)查詢,則應(yīng)該創(chuàng)建如下的復(fù)合索引:

db.person.createIndex( {name: 1, age: 1} )

除了查詢的需求能夠影響索引的順序,字段的值分布也是一個(gè)重要的考量因素,即使person集合所有的查詢都是『name和age字段組合』(指定特定的name和age),字段的順序也是有影響的。

age字段的取值很有限,即擁有相同age字段的文檔會(huì)有很多;而name字段的取值則豐富很多,擁有相同name字段的文檔很少;顯然先按name字段查找,再在相同name的文檔里查找age字段更為高效。

多key索引 (Multikey Index)

當(dāng)索引的字段為數(shù)組時(shí),創(chuàng)建出的索引稱為多key索引,多key索引會(huì)為數(shù)組的每個(gè)元素建立一條索引,比如person表加入一個(gè)habbit字段(數(shù)組)用于描述興趣愛(ài)好,需要查詢有相同興趣愛(ài)好的人就可以利用habbit字段的多key索引。

{"name" : "jack", "age" : 19, habbit: ["football, runnning"]}
db.person.createIndex( {habbit: 1} )  // 自動(dòng)創(chuàng)建多key索引
db.person.find( {habbit: "football"} )

其他類型索引

哈希索引(Hashed Index)是指按照某個(gè)字段的hash值來(lái)建立索引,目前主要用于MongoDB Sharded Cluster的Hash分片,hash索引只能滿足字段完全匹配的查詢,不能滿足范圍查詢等。

地理位置索引(Geospatial Index)能很好的解決O2O的應(yīng)用場(chǎng)景,比如『查找附近的美食』、『查找某個(gè)區(qū)域內(nèi)的車站』等。

文本索引(Text Index)能解決快速文本查找的需求,比如有一個(gè)博客文章集合,需要根據(jù)博客的內(nèi)容來(lái)快速查找,則可以針對(duì)博客內(nèi)容建立文本索引。

索引額外屬性

MongoDB除了支持多種不同類型的索引,還能對(duì)索引定制一些特殊的屬性。

·唯一索引 (unique index):保證索引對(duì)應(yīng)的字段不會(huì)出現(xiàn)相同的值,比如_id索引就是唯一索引。

·TTL索引:可以針對(duì)某個(gè)時(shí)間字段,指定文檔的過(guò)期時(shí)間(經(jīng)過(guò)指定時(shí)間后過(guò)期 或 在某個(gè)時(shí)間點(diǎn)過(guò)期)。

·部分索引 (partial index): 只針對(duì)符合某個(gè)特定條件的文檔建立索引,3.2版本才支持該特性。

·稀疏索引(sparse index): 只針對(duì)存在索引字段的文檔建立索引,可看做是部分索引的一種特殊情況。

關(guān)于mongodb的索引種類就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI