Mongodb使用索引進(jìn)行查詢(xún)優(yōu)化的操作方法
學(xué)習(xí)mongodb,體會(huì)mongodb的每一個(gè)使用細(xì)節(jié),歡迎閱讀威贊的文章。這是威贊發(fā)布的第80篇mongodb技術(shù)文章,歡迎瀏覽本專(zhuān)欄威贊發(fā)布的其他文章。如果您認(rèn)為我的文章對(duì)您有幫助或者解決您的問(wèn)題,歡迎在文章下面點(diǎn)個(gè)贊,或者關(guān)注威贊。謝謝。
前面的文檔當(dāng)中,我們重點(diǎn)介紹了mongodb數(shù)據(jù)更新update中各種各樣的操作符。有興趣的小伙伴們可以查看本專(zhuān)欄里的相關(guān)文章。這篇文章,結(jié)合官方文檔,探討一下使用索引進(jìn)行查詢(xún)優(yōu)化。
概述
為集合建立合適的索引,能夠有效的減少查詢(xún)操作時(shí)掃描數(shù)據(jù)的數(shù)量 ,從而提高查詢(xún)效率,簡(jiǎn)化了mongodb內(nèi)部查詢(xún)工作。如原來(lái)的某個(gè)查詢(xún)需要進(jìn)行全表掃描。當(dāng)集合中有1000條數(shù)據(jù)時(shí),可能需要逐一掃描這1000條數(shù)據(jù),才可以返回查詢(xún)結(jié)果。而當(dāng)為查詢(xún)字段添加索引后,通過(guò)索引,直接定位到查詢(xún)結(jié)果,可能會(huì)極大的減少掃描文檔數(shù)據(jù)的數(shù)量。
為讀取操作添加索引
當(dāng)用戶(hù)建立查詢(xún)語(yǔ)句,計(jì)劃通過(guò)指定字段或幾個(gè)字段查詢(xún)數(shù)據(jù)時(shí),在指定字段的索引或者幾個(gè)字段的復(fù)合索引能夠避免對(duì)集合進(jìn)行全表掃描。
如一個(gè)針對(duì)表inventory的查詢(xún),要求使用字段type作為過(guò)濾條件,type是用戶(hù)指定的一個(gè)數(shù)值
var typeValue = <someUserInput>; db.inventory.find( {type: typeValue});
為了提高這個(gè)針對(duì)集合inventory查詢(xún)的性能,在集合inventory創(chuàng)建一個(gè)type字段的索引。使用db.collection.createIndex()方法創(chuàng)建。這個(gè)索引,能夠避免查詢(xún)整個(gè)集合來(lái)返回?cái)?shù)據(jù)。
db.inventory.createIndex({type: 1})
用戶(hù)可以通過(guò)分析執(zhí)行計(jì)劃,來(lái)確定mongodb是否使用當(dāng)前索引。
除了提高查詢(xún)效率以外,索引還可以改善排序操作的效率并能夠提過(guò)存儲(chǔ)空間使用率。
查詢(xún)操作過(guò)濾度
查詢(xún)操作過(guò)濾度表示了查詢(xún)操作中使用的過(guò)濾詞排除或者過(guò)濾文檔的優(yōu)良程度。查詢(xún)操作過(guò)濾度能夠決定該查詢(xún)是否使用索引。高過(guò)濾度查詢(xún),能夠匹配出更小范圍的文檔數(shù)據(jù)。如針對(duì)_id字段等等值查詢(xún)就具備非常高的查詢(xún)操作過(guò)濾度。它幾乎可以匹配到唯一的文檔數(shù)據(jù)。相反,低過(guò)濾度的查詢(xún)會(huì)匹配集合中更多百分比的數(shù)據(jù),幾乎不能使用索引。
例如不等操作$nin和$ne就不是高過(guò)濾度查詢(xún)操作,這兩個(gè)查詢(xún)操作經(jīng)常會(huì)匹配到集合中大部分的數(shù)據(jù)。因此在大多數(shù)查詢(xún)當(dāng)中,帶有$nin和$ne操作的查詢(xún),使用索引查詢(xún)效率,不會(huì)比全表掃描高多少。
而對(duì)于正則表達(dá)式的查詢(xún)過(guò)濾度,還與正則表達(dá)式本身相關(guān)。
索引覆蓋查詢(xún)
索引覆蓋查詢(xún)只完全通過(guò)索引過(guò)濾數(shù)據(jù)并且使用索引中的字段來(lái)返回結(jié)果而不需要查詢(xún)文檔數(shù)據(jù)的查詢(xún)。同時(shí)滿(mǎn)足下面三個(gè)條件,就可以所該索引覆蓋了查詢(xún)
- 查詢(xún)中所有查詢(xún)字段都是索引的一部分
- 查詢(xún)返回字段也包含在該索引當(dāng)中
- 查詢(xún)當(dāng)中過(guò)濾字段沒(méi)有對(duì)null的過(guò)濾(如{"field": null}或者{"field": {$eq: null}})。
例如在集合inventory中創(chuàng)建字段type和item的索引
db.inventory.createIndex({type: 1, item:1})
該索引覆蓋了下面的查詢(xún)操作。只通過(guò)type和item字段過(guò)濾數(shù)據(jù),只返回item字段
db.inventory.find( {type:"food", item: /^c/}, {item:1, _id:0} )
因?yàn)樵撍饕胁⒉话琠id字段,因此查詢(xún)返回字段中,需要顯示的把_id字段排除。
嵌入式文檔索引覆蓋查詢(xún)
同樣,索引覆蓋查詢(xún)也適用于嵌入式文檔。例如,集合userdata中有下面的數(shù)據(jù)
{ _id:1, user: { login: "tester"}}
為該集合建立索引
db.userdata.createIndex({"user.login":1})
該索引可以覆蓋下面的查詢(xún)
db.userdata.find( {"user.login": "tester"}, {"user.login": 1, _id: 0})
多鍵索引覆蓋查詢(xún)
多鍵索引能夠覆蓋針對(duì)索引中非數(shù)組字段的查詢(xún)。不能覆蓋帶有數(shù)組字段的查詢(xún)。
索引覆蓋查詢(xún)性能
因?yàn)樗饕?dāng)中已經(jīng)包含了查詢(xún)中所需要的所有字段和返回字段 ,mongodb可以只通過(guò)索引返回查詢(xún)結(jié)果。只通過(guò)索引的查詢(xún)效率,比其他任何索引外查詢(xún)的效率都要高。因?yàn)樗饕ǔ14嬖趦?nèi)存當(dāng)中或順序的保存在磁盤(pán)上,而且會(huì)比索引依賴(lài)的文檔小。
索引查詢(xún)優(yōu)化限制
- 地理信息索引不支持索引覆蓋查詢(xún)
- 多鍵查詢(xún)不能覆蓋帶有數(shù)組字段的查詢(xún)
- 在分片集中,包含分片key的索引才能支持索引覆蓋查詢(xún)
當(dāng)然用戶(hù)可以查看執(zhí)行計(jì)劃,確當(dāng)該查詢(xún)是否是索引覆蓋查詢(xún)。
到此這篇關(guān)于Mongodb使用索引進(jìn)行查詢(xún)優(yōu)化的文章就介紹到這了,更多相關(guān)Mongodb索引內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mongoose find 查詢(xún)返回json數(shù)據(jù)處理方式
這篇文章主要介紹了Mongoose find 查詢(xún)返回json數(shù)據(jù)處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04Mongodb聚合函數(shù)count、distinct、group如何實(shí)現(xiàn)數(shù)據(jù)聚合操作
Mongodb中自帶的基本聚合函數(shù)有三種:count、distinct和group。下面我們分別來(lái)講述一下這三個(gè)基本聚合函數(shù)及如何實(shí)現(xiàn)數(shù)據(jù)聚合操作,感興趣的朋友一起學(xué)習(xí)吧2016-05-05MongoDB實(shí)現(xiàn)查詢(xún)、分頁(yè)和排序操作以及游標(biāo)的使用
本文詳細(xì)講解了MongoDB實(shí)現(xiàn)查詢(xún)、分頁(yè)和排序操作以及游標(biāo)的使用方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07MongoDB快速入門(mén)及其SpringBoot實(shí)戰(zhàn)教程
MongoDB是一個(gè)開(kāi)源、高性能、無(wú)模式的文檔型數(shù)據(jù)庫(kù),當(dāng)初的設(shè)計(jì)就是用于簡(jiǎn)化開(kāi)發(fā)和方便擴(kuò)展,是NoSQL數(shù)據(jù)庫(kù)產(chǎn)品中的一種,它支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是一種類(lèi)似于JSON的格式叫BSON,本文介紹MongoDB快速入門(mén)及其SpringBoot實(shí)戰(zhàn),感興趣的朋友一起看看吧2023-12-12mongodb運(yùn)維_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了mongodb運(yùn)維的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-08-08Mongodb 數(shù)據(jù)類(lèi)型及Mongoose常用CURD
MongoDB 是一個(gè)開(kāi)源的 NoSQL 數(shù)據(jù)庫(kù),相比 MySQL 那樣的關(guān)系型數(shù)據(jù)庫(kù),它更為輕巧、靈活,非常適合在數(shù)據(jù)規(guī)模很大、事務(wù)性不強(qiáng)的場(chǎng)合下使用,本文給大家介紹Mongodb 數(shù)據(jù)類(lèi)型及Mongoose常用CURD,感興趣的朋友一起學(xué)習(xí)吧2016-01-01MongoDB分組查詢(xún)和聚合查詢(xún)實(shí)例教程
聚合(aggregate)是MongoDB的高級(jí)查詢(xún)語(yǔ)言,它允許我們通過(guò)轉(zhuǎn)化合并多個(gè)文檔的數(shù)據(jù)來(lái)生成新的在單個(gè)文檔里不存在的文檔信息,下面這篇文章主要給大家介紹了關(guān)于MongoDB分組查詢(xún)和聚合查詢(xún)的相關(guān)資料,需要的朋友可以參考下2023-05-05