最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mongodb使用索引進(jìn)行查詢優(yōu)化的操作方法

 更新時(shí)間:2024年06月28日 10:36:14   作者:威贊  
為集合建立合適的索引,能夠有效的減少查詢操作時(shí)掃描數(shù)據(jù)的數(shù)量 ,從而提高查詢效率,簡(jiǎn)化了mongodb內(nèi)部查詢工作,這篇文章主要介紹了Mongodb使用索引進(jìn)行查詢優(yōu)化的操作方法,需要的朋友可以參考下

學(xué)習(xí)mongodb,體會(huì)mongodb的每一個(gè)使用細(xì)節(jié),歡迎閱讀威贊的文章。這是威贊發(fā)布的第80篇mongodb技術(shù)文章,歡迎瀏覽本專欄威贊發(fā)布的其他文章。如果您認(rèn)為我的文章對(duì)您有幫助或者解決您的問題,歡迎在文章下面點(diǎn)個(gè)贊,或者關(guān)注威贊。謝謝。

前面的文檔當(dāng)中,我們重點(diǎn)介紹了mongodb數(shù)據(jù)更新update中各種各樣的操作符。有興趣的小伙伴們可以查看本專欄里的相關(guān)文章。這篇文章,結(jié)合官方文檔,探討一下使用索引進(jìn)行查詢優(yōu)化。

概述

為集合建立合適的索引,能夠有效的減少查詢操作時(shí)掃描數(shù)據(jù)的數(shù)量 ,從而提高查詢效率,簡(jiǎn)化了mongodb內(nèi)部查詢工作。如原來的某個(gè)查詢需要進(jìn)行全表掃描。當(dāng)集合中有1000條數(shù)據(jù)時(shí),可能需要逐一掃描這1000條數(shù)據(jù),才可以返回查詢結(jié)果。而當(dāng)為查詢字段添加索引后,通過索引,直接定位到查詢結(jié)果,可能會(huì)極大的減少掃描文檔數(shù)據(jù)的數(shù)量。

為讀取操作添加索引

當(dāng)用戶建立查詢語句,計(jì)劃通過指定字段或幾個(gè)字段查詢數(shù)據(jù)時(shí),在指定字段的索引或者幾個(gè)字段的復(fù)合索引能夠避免對(duì)集合進(jìn)行全表掃描。

如一個(gè)針對(duì)表inventory的查詢,要求使用字段type作為過濾條件,type是用戶指定的一個(gè)數(shù)值

var typeValue = <someUserInput>;
db.inventory.find( {type: typeValue});

為了提高這個(gè)針對(duì)集合inventory查詢的性能,在集合inventory創(chuàng)建一個(gè)type字段的索引。使用db.collection.createIndex()方法創(chuàng)建。這個(gè)索引,能夠避免查詢整個(gè)集合來返回?cái)?shù)據(jù)。

db.inventory.createIndex({type: 1})

用戶可以通過分析執(zhí)行計(jì)劃,來確定mongodb是否使用當(dāng)前索引。

除了提高查詢效率以外,索引還可以改善排序操作的效率并能夠提過存儲(chǔ)空間使用率。

查詢操作過濾度

查詢操作過濾度表示了查詢操作中使用的過濾詞排除或者過濾文檔的優(yōu)良程度。查詢操作過濾度能夠決定該查詢是否使用索引。高過濾度查詢,能夠匹配出更小范圍的文檔數(shù)據(jù)。如針對(duì)_id字段等等值查詢就具備非常高的查詢操作過濾度。它幾乎可以匹配到唯一的文檔數(shù)據(jù)。相反,低過濾度的查詢會(huì)匹配集合中更多百分比的數(shù)據(jù),幾乎不能使用索引。

例如不等操作$nin和$ne就不是高過濾度查詢操作,這兩個(gè)查詢操作經(jīng)常會(huì)匹配到集合中大部分的數(shù)據(jù)。因此在大多數(shù)查詢當(dāng)中,帶有$nin和$ne操作的查詢,使用索引查詢效率,不會(huì)比全表掃描高多少。

而對(duì)于正則表達(dá)式的查詢過濾度,還與正則表達(dá)式本身相關(guān)。

索引覆蓋查詢

索引覆蓋查詢只完全通過索引過濾數(shù)據(jù)并且使用索引中的字段來返回結(jié)果而不需要查詢文檔數(shù)據(jù)的查詢。同時(shí)滿足下面三個(gè)條件,就可以所該索引覆蓋了查詢

  • 查詢中所有查詢字段都是索引的一部分
  • 查詢返回字段也包含在該索引當(dāng)中
  • 查詢當(dāng)中過濾字段沒有對(duì)null的過濾(如{"field": null}或者{"field": {$eq: null}})。

例如在集合inventory中創(chuàng)建字段type和item的索引

db.inventory.createIndex({type: 1, item:1})

該索引覆蓋了下面的查詢操作。只通過type和item字段過濾數(shù)據(jù),只返回item字段

db.inventory.find(
    {type:"food", item: /^c/},
    {item:1, _id:0}
)

因?yàn)樵撍饕胁⒉话琠id字段,因此查詢返回字段中,需要顯示的把_id字段排除。

嵌入式文檔索引覆蓋查詢

同樣,索引覆蓋查詢也適用于嵌入式文檔。例如,集合userdata中有下面的數(shù)據(jù)

{ _id:1, user: { login: "tester"}}

為該集合建立索引

db.userdata.createIndex({"user.login":1})

該索引可以覆蓋下面的查詢

db.userdata.find( {"user.login": "tester"}, {"user.login": 1, _id: 0})

多鍵索引覆蓋查詢

多鍵索引能夠覆蓋針對(duì)索引中非數(shù)組字段的查詢。不能覆蓋帶有數(shù)組字段的查詢。

索引覆蓋查詢性能

因?yàn)樗饕?dāng)中已經(jīng)包含了查詢中所需要的所有字段和返回字段 ,mongodb可以只通過索引返回查詢結(jié)果。只通過索引的查詢效率,比其他任何索引外查詢的效率都要高。因?yàn)樗饕ǔ14嬖趦?nèi)存當(dāng)中或順序的保存在磁盤上,而且會(huì)比索引依賴的文檔小。

索引查詢優(yōu)化限制

  • 地理信息索引不支持索引覆蓋查詢
  • 多鍵查詢不能覆蓋帶有數(shù)組字段的查詢
  • 在分片集中,包含分片key的索引才能支持索引覆蓋查詢

當(dāng)然用戶可以查看執(zhí)行計(jì)劃,確當(dāng)該查詢是否是索引覆蓋查詢。

到此這篇關(guān)于Mongodb使用索引進(jìn)行查詢優(yōu)化的文章就介紹到這了,更多相關(guān)Mongodb索引內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

武功县| 元阳县| 江陵县| 聂拉木县| 潞城市| 叙永县| 马尔康县| 肃北| 沙湾县| 沙湾县| 上蔡县| 奉节县| 吉水县| 泰宁县| 凌云县| 辽宁省| 扎兰屯市| 玉田县| 德钦县| 乐陵市| 乐陵市| 乐至县| 怀远县| 普定县| 嘉善县| 巩留县| 漯河市| 宝坻区| 京山县| 边坝县| 璧山县| 黄骅市| 霸州市| 河曲县| 曲周县| 司法| 平利县| 威宁| 肥乡县| 彰武县| 枣庄市|