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

MongoDB 索引創(chuàng)建和查詢優(yōu)化的方法

 更新時(shí)間:2024年07月04日 10:36:10   作者:運(yùn)維仙人  
這篇文章主要介紹了MongoDB 索引創(chuàng)建和查詢優(yōu)化的方法,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧

2.1 批量插入數(shù)據(jù)

單條數(shù)據(jù)插入
db.collection.insertOne()
多條數(shù)據(jù)插入
db.collection.insertMany()

db.inventory.insertMany( [
   { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
   { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
   { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
   { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
]);

插入數(shù)據(jù)

use testdb
for(var i =1; i<10; i++) db.users.insert({id:i,name: "zhangsan"+i,age: 100+i})

2.2 查詢選擇器

2.2.1 常規(guī)查詢方式

最簡(jiǎn)單的查詢語句為:db.customers.find(),按照插入的順序返回前20個(gè)文檔,如果 記錄總數(shù)比20大,則我們可以通過命令“it”獲取更多文檔。 
> db.users.find({id:9}) 
精確匹配選擇器,返回包含鍵值對(duì)id:9的文檔。 
> db.users.find({name:"xiaoming",age:101}) 
精確匹配選擇器,但查詢條件是要返回同時(shí)匹配鍵值對(duì){name:"xiaoming",age:101}的文檔。 
> db.users.find({age:{$lt:102}}) 
$lt表示的是小于 
> db.users.find({age:{$lte:102}}) 
$lte表示的小于或等于 
> db.users.find({age:{$gt:105}}) 
$gt表示的是大于 
> db.users.find({age:{$gte:105}}) 
$gte表示的是大于或等于 
> db.users.find({age:{$lt:120,$gte:105}}) 
范圍選擇器,age:{$lt:120,$gte:119}表示的是小于120,大于或等于119 
> db.users.find({id:{$in:[1,2]}}) 
表示返回key的值在某些value范圍內(nèi) 
> db.users.find({id:{$nin:[1,2]}}) 
$nin表示返回key的值不在某些value范圍內(nèi),$nin是一種比較低效的査詢選擇器,它會(huì)進(jìn)行全表掃描,因此最好不要單獨(dú)使用$nin 
> db.users.find({id:{$ne:1}}) 
$ne表示不等于。單獨(dú)使用$ne,它也不會(huì)利用索引的優(yōu)勢(shì),反而會(huì)進(jìn)行全表掃描,我們最好與其他查詢選擇器配合使用。 
> db.users.find({$or:[{id:11},{age:109}] })
$or表示或運(yùn)算的選擇器,主要用于對(duì)兩個(gè)不同key對(duì)應(yīng)的文檔進(jìn)行連接。 
> db.users.find({$and:[{id:1},{age:109}]}) 
$and表示與運(yùn)算的選擇器,對(duì)于兩個(gè)不同的key,要同時(shí)滿足條件。 
> db.users.find({id:{$exists:ture}}) 
$exists與關(guān)系數(shù)據(jù)庫中的exists不一樣,因?yàn)镸ongoDB的表結(jié)構(gòu)不是固定的,有的時(shí)候需要返回包含有某個(gè)字段的所有記錄或者不包含某個(gè)字段的所有記錄。

2.2.2 索引和查詢優(yōu)化

索引是個(gè)與數(shù)據(jù)存儲(chǔ)和査詢相關(guān)的古老話題,目的只有一個(gè):“提高數(shù)據(jù)獲取的性能”。我們知道一本書的前面幾頁肯定會(huì)有一個(gè)目錄,這個(gè)目錄式的索引能使我們快速査詢想看的內(nèi)容。索引保存在哪里,是個(gè)什么樣的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)領(lǐng)域的索引無外乎也是這兩個(gè)主題。

數(shù)據(jù)庫保存記錄的機(jī)制是建立在文件系統(tǒng)上的,索引也是以文件的形式存儲(chǔ)在磁盤上,在數(shù)據(jù)庫中用到的最多的索引結(jié)構(gòu)就是B樹。盡管索引在數(shù)據(jù)庫領(lǐng)域是不可缺少的,但是對(duì)一個(gè)表建立過多的索引也會(huì)帶來一些問題,索引的建立要花費(fèi)系統(tǒng)時(shí)間,同時(shí)索引文件也會(huì)占用磁盤空間。
**索引通常能夠極大的提高查詢的效率,如果沒有索引,MongoDB在讀取數(shù)據(jù)時(shí)必須掃描集合中的每個(gè)文件并選取那些符合查詢條件的記錄。**掃描全集合的查詢效率是非常低的,特別在處理大量的數(shù)據(jù)時(shí),查詢可以要花費(fèi)幾十秒甚至幾分鐘,這對(duì)網(wǎng)站的性能是非常致命的。
索引是特殊的數(shù)據(jù)結(jié)構(gòu),索引存儲(chǔ)在一個(gè)易于遍歷讀取的數(shù)據(jù)集合中,索引是對(duì)數(shù)據(jù)庫表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu)。
MongoDB索引的數(shù)據(jù)結(jié)構(gòu)也是B+樹,它能存儲(chǔ)一小部分集合的數(shù)據(jù),具體來說就是存儲(chǔ)集合中建有索引的一個(gè)或多個(gè)字段的值,而且按照值的升序或降序排列。對(duì)于一個(gè)查詢來說,如果存在合適的索引,MongoDB能夠利用這個(gè)索引減少文檔的掃描數(shù)量。
如圖所示查詢低于30歲的用戶,不用去掃描全部文檔,通過索引快速返回結(jié)果,這樣查詢的效率是很高的。

單字段索引

MongoDB默認(rèn)為所有集合都創(chuàng)建了一個(gè)_id字段的單字段索引,而且這個(gè)索引是唯一的,不能被刪除,_id字段作為一個(gè)集合的主鍵,值是唯一的,對(duì)于一個(gè)集合來說,也可以在其他字段上創(chuàng)建單字段的唯一索引。
創(chuàng)建單一鍵索引:db.collection.createIndex( { : } ),其中 是你要?jiǎng)?chuàng)建索引的字段名, 是索引類型,例如:1(升序)或 -1(降序)。

插入數(shù)據(jù)

for(var i = 1;i < 10;i++) db.custoners.insert({name:"zhangsan"+i,province:"liaoning"})
for(var i = 1;i < 10;i++) db.customers.insert({name:"lisi"+i,province:"fujian"})
for(var i = 1;i < 10;i++) db.customers.insert({name:"niuer"+i,province:"guangdong"})
for(var i = 1;i < 10;i++) db.customers.insert({name:"wangwu"+i,province:"Hunan"})
for(var i = 1;i < 10;i++) db.customers.insert({name:"liyi"+i,province:"Sichuan"})

創(chuàng)建索引

建立單字段唯一索引或者去掉{unique:true}選項(xiàng)就是一個(gè)普通的單字段索引
db.customers.createIndex({name:1},{unique:true})

1表示升序創(chuàng)建索引,-1表示降序創(chuàng)建索引。

通過explain查看執(zhí)行計(jì)劃

MongoDB中的explain()方法用于顯示查詢執(zhí)行計(jì)劃,它可以幫助我們了解MongoDB如何執(zhí)行一個(gè)查詢。
執(zhí)行explain()方法后,MongoDB將返回一個(gè)對(duì)象,該對(duì)象描述了查詢執(zhí)行的過程,包括查詢的階段、輸入輸出、使用的索引等信息。
這個(gè)對(duì)象通常包含以下字段:

  • stages:查詢執(zhí)行的階段列表,每個(gè)階段描述了查詢的一部分執(zhí)行過程。
  • input:查詢輸入的文檔數(shù)量。
  • output:查詢輸出的文檔數(shù)量。
  • millis:查詢執(zhí)行的時(shí)間(毫秒)。
  • executionStats:更詳細(xì)的執(zhí)行統(tǒng)計(jì)信息。

其中,stages字段是最重要的,它描述了查詢從開始到結(jié)束的所有階段。每個(gè)階段都有一個(gè)type字段,描述了這個(gè)階段的類型,比如:

  • COLLSCAN:掃描整個(gè)集合。
  • IXSCAN:掃描索引。
  • SHARD_MERGE:合并從多個(gè)分片返回的結(jié)果。

通過查看stages字段,我們可以了解查詢使用了哪些索引,是否有更好的優(yōu)化方案等。
需要注意的是,explain()方法返回的結(jié)果包含了大量的詳細(xì)信息,對(duì)于普通用戶來說可能比較難以理解。通常我們只需要關(guān)注stages字段,以及其中的type值為IXSCAN的階段,因?yàn)檫@是查詢執(zhí)行的關(guān)鍵階段。

沒走索引查詢,查詢使用了COLLSCAN階段掃描了整個(gè)集合,但是并沒有使用到索引。

命中索引進(jìn)行查詢

復(fù)合索引

創(chuàng)建復(fù)合索引:db.collection.createIndex( { : , : } ),其中 和 是你要?jiǎng)?chuàng)建索引的字段名, 和 是索引類型,
例如:1(升序)或 -1(降序)。
請(qǐng)注意,創(chuàng)建索引可能需要一些時(shí)間,具體取決于你的數(shù)據(jù)量及系統(tǒng)性能。同時(shí),創(chuàng)建過多的索引可能會(huì)對(duì)寫入性能產(chǎn)生負(fù)面影響,因此需要謹(jǐn)慎考慮。

> db.customers.find({"name" : "liyi6", "province" : "Sichuan"}).explain()
{
	"explainVersion" : "1",
	"queryPlanner" : {
		"namespace" : "sample_mflix.customers",
		"indexFilterSet" : false,
		"parsedQuery" : {
			"$and" : [
				{
					"name" : {
						"$eq" : "liyi6"
					}
				},
				{
					"province" : {
						"$eq" : "Sichuan"
					}
				}
			]
		},
		"queryHash" : "AE1EB7A5",
		"planCacheKey" : "C0AA3338",
		"maxIndexedOrSolutionsReached" : false,
		"maxIndexedAndSolutionsReached" : false,
		"maxScansToExplodeReached" : false,
		"winningPlan" : {
			"stage" : "FETCH",
			"inputStage" : {
				"stage" : "IXSCAN",
				"keyPattern" : {
					"name" : 1,
					"province" : 1
				},
				"indexName" : "name_1_province_1",
				"isMultiKey" : false,
				"multiKeyPaths" : {
					"name" : [ ],
					"province" : [ ]
				},
				"isUnique" : false,
				"isSparse" : false,
				"isPartial" : false,
				"indexVersion" : 2,
				"direction" : "forward",
				"indexBounds" : {
					"name" : [
						"[\"liyi6\", \"liyi6\"]"
					],
					"province" : [
						"[\"Sichuan\", \"Sichuan\"]"
					]
				}
			}
		},
		"rejectedPlans" : [ ]
	},
	"command" : {
		"find" : "customers",
		"filter" : {
			"name" : "liyi6",
			"province" : "Sichuan"
		},
		"$db" : "sample_mflix"
	},
	"serverInfo" : {
		"host" : "13727b89dec5",
		"port" : 27017,
		"version" : "5.0.5",
		"gitVersion" : "d65fd89df3fc039b5c55933c0f71d647a54510ae"
	},
	"serverParameters" : {
		"internalQueryFacetBufferSizeBytes" : 104857600,
		"internalQueryFacetMaxOutputDocSizeBytes" : 104857600,
		"internalLookupStageIntermediateDocumentMaxSizeBytes" : 104857600,
		"internalDocumentSourceGroupMaxMemoryBytes" : 104857600,
		"internalQueryMaxBlockingSortMemoryUsageBytes" : 104857600,
		"internalQueryProhibitBlockingMergeOnMongoS" : 0,
		"internalQueryMaxAddToSetBytes" : 104857600,
		"internalDocumentSourceSetWindowFieldsMaxMemoryBytes" : 104857600
	},
	"ok" : 1
}

數(shù)組的多鍵索引

注意,創(chuàng)建索引可能需要一些時(shí)間,具體取決于你的數(shù)據(jù)量和系統(tǒng)性能。同時(shí),創(chuàng)建過多的索引可能會(huì)對(duì)寫入性能產(chǎn)生負(fù)面影響,因此需要謹(jǐn)慎考慮。
tags 的數(shù)組字段為例,展示多鍵索

> for(var i = 1;i < 10;i++) db.ccustomers.insert({name:"liyi"+i,"tags": ["sports", "music", "movies"]})
WriteResult({ "nInserted" : 1 })
> for(var i = 1;i < 10;i++) db.ccustomers.insert({name:"liyao"+i,"tags": ["sports", "movies","games","read"]})
WriteResult({ "nInserted" : 1 })
> for(var i = 1;i < 10;i++) db.ccustomers.insert({name:"lisi"+i,"tags": ["sports", "music", "movies"]})
WriteResult({ "nInserted" : 1 })
> for(var i = 1;i < 10;i++) db.ccustomers.insert({name:"liyiyi"+i,"tags": ["sports",  "movies","write"]})
WriteResult({ "nInserted" : 1 })
> db.ccustomers.createIndex({"tags":1})
{
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"createdCollectionAutomatically" : false,
	"ok" : 1
}

explain

查詢結(jié)果

查詢優(yōu)化

MongoDB查詢優(yōu)化的方法主要有以下幾點(diǎn):

  • 用合適的索引:索引是提高查詢性能的關(guān)鍵。MongoDB支持多種索引類型,如單一鍵索引、復(fù)合索引、文本索引、地理空間索引等。在設(shè)計(jì)數(shù)據(jù)庫時(shí),應(yīng)根據(jù)數(shù)據(jù)的特性和查詢需求選擇合適的索引類型。同時(shí),也要注意索引的使用,盡量使用已經(jīng)創(chuàng)建的索引,避免全集合掃描。
  • 優(yōu)化查詢語句:查詢語句的設(shè)計(jì)也會(huì)影響查詢性能。應(yīng)盡量避免使用不等于操作符、模運(yùn)算符等導(dǎo)致全集合掃描的操作符。同時(shí),應(yīng)使用投影查詢,減少返回的字段,減少數(shù)據(jù)傳輸和處理的開銷。
  • 批量操作:批量操作可以減少IO操作次數(shù),提高性能。例如批量插入、批量更新、批量刪除等。
  • 使用緩存:使用緩存可以避免重復(fù)查詢,提高查詢性能。
  • 優(yōu)化數(shù)據(jù)結(jié)構(gòu):數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)也會(huì)影響查詢性能。應(yīng)盡量選擇合適的數(shù)據(jù)類型,避免使用嵌套文檔和數(shù)組,提高查詢效率。
  • 調(diào)整系統(tǒng)參數(shù):根據(jù)系統(tǒng)性能和硬件配置調(diào)整MongoDB的配置參數(shù),例如內(nèi)存、磁盤、網(wǎng)絡(luò)等參數(shù)。
  • 使用分析工具:使用MongoDB提供的分析工具,如explain()、profile()等,可以了解查詢性能,找出優(yōu)化點(diǎn)。

位慢查詢的方法是打開數(shù)據(jù)庫的監(jiān)視功能,它默認(rèn)是關(guān)閉的,我們可以通過下面的命令打開。

db.setProfilingLevel(level,[ slowms]) 

參數(shù):
level是監(jiān)視級(jí)別。
值為0表示關(guān)閉數(shù)據(jù)庫的監(jiān)視功能
值為1表示只記錄慢查詢
值為2表示記錄所有的操作
slowms為可選參數(shù),設(shè)定慢查詢的閾值。
所有監(jiān)視的結(jié)果都將保存到一個(gè)特殊的集合system.profile中。

> db.setProfilingLevel(2)
{ "was" : 0, "slowms" : 100, "sampleRate" : 1, "ok" : 1 }
> db.system.profile.find()

實(shí)操記錄:
一個(gè)走索引和沒有走索引的查詢

打開查看查詢記錄:

2.3 總結(jié)

MongoDB可以在一個(gè)集合上建立一個(gè)或多個(gè)索引,而且必須為在字段_id建立一個(gè)索引,建索引的目的與關(guān)系數(shù)據(jù)庫一樣,就是為了提高對(duì)數(shù)據(jù)庫的查詢效率;
一旦索引創(chuàng)建好,MongoDB會(huì)自動(dòng)地根據(jù)數(shù)據(jù)的變化維護(hù)索引,如果索引太大而不能全部保存在內(nèi)存中,將被移到磁盤文件上,這樣會(huì)影響查詢性能,因此要時(shí)刻監(jiān)控索引的大小,保證合適的索引在內(nèi)存中;
監(jiān)控一個(gè)查詢是否用到索引,可以在查詢語句后用explain命令或profile()方式進(jìn)行監(jiān)控。并不是所有的字段都要建立索引,我們應(yīng)該根據(jù)自己業(yè)務(wù)所涉及的查詢,建立合適的索引;
如果系統(tǒng)有大量的寫操作,由于需要維護(hù)索引的變化,會(huì)導(dǎo)致系統(tǒng)性能降低。我們?cè)趯?duì)大數(shù)據(jù)建立索引時(shí)最好在后臺(tái)進(jìn)行,否則會(huì)導(dǎo)致數(shù)據(jù)庫停止響應(yīng)。要注意雖然我們?cè)谀承┳侄紊辖怂饕?,但是查詢時(shí)可能用不上索引,如使用 n e 和 ne和 ne和nin表達(dá)式等。

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

相關(guān)文章

  • MongoDB常用操作匯總

    MongoDB常用操作匯總

    MongoDB 是由C++語言編寫的,是一個(gè)基于分布式文件存儲(chǔ)的開源數(shù)據(jù)庫系統(tǒng)。在高負(fù)載的情況下,添加更多的節(jié)點(diǎn),可以保證服務(wù)器性能。MongoDB 旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。
    2017-05-05
  • MongoDB對(duì)Document(文檔)的插入、刪除及更新

    MongoDB對(duì)Document(文檔)的插入、刪除及更新

    這篇文章介紹了MongoDB對(duì)Document(文檔)的插入、刪除及更新,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 使用MongoDB實(shí)現(xiàn)視頻播放進(jìn)度的保存與恢復(fù)(斷點(diǎn)續(xù)播)

    使用MongoDB實(shí)現(xiàn)視頻播放進(jìn)度的保存與恢復(fù)(斷點(diǎn)續(xù)播)

    在視頻類業(yè)務(wù)中,斷點(diǎn)續(xù)播 是最基礎(chǔ)、也是最核心的能力之一,本文將介紹如何 僅使用 MongoDB 實(shí)現(xiàn)視頻播放進(jìn)度的保存與恢復(fù),適用于在線視頻、課程學(xué)習(xí)、長視頻播放等場(chǎng)景,需要的朋友可以參考下
    2026-02-02
  • MongoDB模糊查詢正則regex(類似like?和?not?like)

    MongoDB模糊查詢正則regex(類似like?和?not?like)

    在類關(guān)系型數(shù)據(jù)庫中,like和not?like是常用的模糊查詢操作符,它允許我們?cè)谄ヅ渥侄蔚臅r(shí)候使用通配符,在MongoDB中,也有類似的操作符,MongoDB?可以使用?$regex?操作符來設(shè)置匹配字符串的正則表達(dá)式,MongoDB?使用?PCRE(Perl?兼容的正則表達(dá)式)作為正則表達(dá)式語言
    2024-02-02
  • MongoDB與MySQL常用操作語句對(duì)照

    MongoDB與MySQL常用操作語句對(duì)照

    這篇文章主要介紹了MongoDB與MySQL常用操作語句對(duì)照,本文整合了兩篇博文,相信最常用的操作都收錄在本文了,需要的朋友可以參考下
    2015-05-05
  • MongoDB如何更新多級(jí)文檔的數(shù)據(jù)

    MongoDB如何更新多級(jí)文檔的數(shù)據(jù)

    MongoDB 這類文檔型數(shù)據(jù)庫與關(guān)系型數(shù)據(jù)庫最大的差別就是所有數(shù)據(jù)是按文檔存儲(chǔ)的,因此更新時(shí)會(huì)涉及深層數(shù)據(jù)更新,例如更如何新某個(gè)對(duì)象的下級(jí)對(duì)象屬性。本篇介紹如何更新多級(jí)文檔的數(shù)據(jù)。
    2021-06-06
  • MongoDB查詢與游標(biāo)之分布式文件存儲(chǔ)

    MongoDB查詢與游標(biāo)之分布式文件存儲(chǔ)

    這篇文章主要介紹了MongoDB的查詢與游標(biāo),查詢就是返回集合中文檔的一個(gè)子集,子集的范圍從0個(gè)文檔到整個(gè)集合;游標(biāo)的客戶端實(shí)現(xiàn)通常能夠在很大程度上對(duì)查詢的最終輸出進(jìn)行控制;感興趣的同學(xué)可以參考閱讀
    2023-04-04
  • Mongodb 崩潰報(bào)錯(cuò) Too many open files的問題解析

    Mongodb 崩潰報(bào)錯(cuò) Too many open files的問題解析

    這篇文章主要介紹了Mongodb 崩潰報(bào)錯(cuò) Too many open files的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • MongoDB通過查詢與游標(biāo)徹底玩轉(zhuǎn)分布式文件存儲(chǔ)

    MongoDB通過查詢與游標(biāo)徹底玩轉(zhuǎn)分布式文件存儲(chǔ)

    MongoDB最大的特點(diǎn)是它支持的查詢語言非常強(qiáng)大,其語法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z言,幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能,而且還支持對(duì)數(shù)據(jù)建立索引,這篇文章主要介紹了MongoDB查詢與游標(biāo),徹底玩轉(zhuǎn)分布式文件存儲(chǔ),需要的朋友可以參考下
    2023-01-01
  • MongoDB使用自帶的命令行工具進(jìn)行備份和恢復(fù)的教程

    MongoDB使用自帶的命令行工具進(jìn)行備份和恢復(fù)的教程

    這篇文章主要介紹了MongoDB使用自帶的命令行工具進(jìn)行備份和恢復(fù)的教程,我們只需要在命令行界面中用簡(jiǎn)單的命令操作mongorestore和mongodump工具就可以實(shí)現(xiàn),需要的朋友可以參考下
    2016-06-06

最新評(píng)論

鄱阳县| 博兴县| 永川市| 滁州市| 蕉岭县| 离岛区| 定陶县| 小金县| 阿瓦提县| 昆山市| 鹤山市| 芷江| 中方县| 嵊州市| 砚山县| 泸州市| 东乌| 全椒县| 大冶市| 浦城县| 南召县| 平凉市| 祁连县| 临城县| 英吉沙县| 本溪| 防城港市| 南京市| 延津县| 二连浩特市| 临武县| 太仆寺旗| 东莞市| 绵阳市| 竹溪县| 泰宁县| 沐川县| 原平市| 齐河县| 聂荣县| 阆中市|