亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數(shù)據(jù)庫 > MongoDB > 正文

MongoDB索引使用詳解

2020-10-29 18:50:14
字體:
供稿:網(wǎng)友

索引就像書的目錄,如果查找某內(nèi)容在沒有目錄的幫助下,只能全篇查找翻閱,這導(dǎo)致效率非常的低下;如果在借助目錄情況下,就能很快的定位具體內(nèi)容所在區(qū)域,效率會直線提高。

索引簡介

首先打開命令行,輸入mongo。默認mongodb會連接名為test的數(shù)據(jù)庫。

➜ ~ mongoMongoDB shell version: 2.4.9connecting to: test> show collections> 

可以使用show collections/tables查看數(shù)據(jù)庫為空。

然后在mongodb命令行終端執(zhí)行如下代碼

> for(var i=0;i<100000;i++) {... db.users.insert({username:'user'+i})... }> show collectionssystem.indexesusers> 

再查看數(shù)據(jù)庫發(fā)現(xiàn)多了system.indexes 和 users兩個表,前者即所謂的索引,后者為新建的數(shù)據(jù)庫表。
這樣user表中即有了10萬條數(shù)據(jù)。

> db.users.find(){ "_id" : ObjectId("5694d5da8fad9e319c5b43e4"), "username" : "user0" }{ "_id" : ObjectId("5694d5da8fad9e319c5b43e5"), "username" : "user1" }{ "_id" : ObjectId("5694d5da8fad9e319c5b43e6"), "username" : "user2" }{ "_id" : ObjectId("5694d5da8fad9e319c5b43e7"), "username" : "user3" }{ "_id" : ObjectId("5694d5da8fad9e319c5b43e8"), "username" : "user4" }{ "_id" : ObjectId("5694d5da8fad9e319c5b43e9"), "username" : "user5" }

現(xiàn)在需要查找其中任意一條數(shù)據(jù),比如

> db.users.find({username: 'user1234'}){ "_id" : ObjectId("5694d5db8fad9e319c5b48b6"), "username" : "user1234" }

發(fā)現(xiàn)這條數(shù)據(jù)成功找到,但需要了解詳細信息,需要加上explain方法

> db.users.find({username: 'user1234'}).explain(){  "cursor" : "BasicCursor",  "isMultiKey" : false,  "n" : 1,  "nscannedObjects" : 100000,  "nscanned" : 100000,  "nscannedObjectsAllPlans" : 100000,  "nscannedAllPlans" : 100000,  "scanAndOrder" : false,  "indexOnly" : false,  "nYields" : 0,  "nChunkSkips" : 0,  "millis" : 30,  "indexBounds" : {      },  "server" : "root:27017"}

參數(shù)很多,目前我們只關(guān)注其中的"nscanned" : 100000和"millis" : 30這兩項。

nscanned表示mongodb在完成這個查詢過程中掃描的文檔總數(shù)。可以發(fā)現(xiàn),集合中的每個文檔都被掃描了,并且總時間為30毫秒。

如果數(shù)據(jù)有1000萬個,如果每次查詢文檔都遍歷一遍。呃,時間也是相當(dāng)可觀。

對于此類查詢,索引是一個非常好的解決方案。

> db.users.ensureIndex({"username": 1})

然后再查找user1234

> db.users.ensureIndex({"username": 1})> db.users.find({username: 'user1234'}).explain(){  "cursor" : "BtreeCursor username_1",  "isMultiKey" : false,  "n" : 1,  "nscannedObjects" : 1,  "nscanned" : 1,  "nscannedObjectsAllPlans" : 1,  "nscannedAllPlans" : 1,  "scanAndOrder" : false,  "indexOnly" : false,  "nYields" : 0,  "nChunkSkips" : 0,  "millis" : 0,  "indexBounds" : {    "username" : [      [        "user1234",        "user1234"      ]    ]  },  "server" : "root:27017"}

的確有點不可思議,查詢在瞬間完成,因為通過索引只查找了一條數(shù)據(jù),而不是100000條。

當(dāng)然使用索引是也是有代價的:對于添加的每一條索引,每次寫操作(插入、更新、刪除)都將耗費更多的時間。這是因為,當(dāng)數(shù)據(jù)發(fā)生變化時,不僅要更新文檔,還要更新級集合上的所有索引。因此,mongodb限制每個集合最多有64個索引。通常,在一個特定的集合上,不應(yīng)該擁有兩個以上的索引。

小技巧

如果一個非常通用的查詢,或者這個查詢造成了性能瓶頸,那么在某字段(比如username)建立索引是非常好的選擇。但只是給管理員用的查詢(不太在意查詢耗費時間),就不該對這個字段建立索引。

復(fù)合索引

索引的值是按一定順序排列的,所以使用索引鍵對文檔進行排序非???。

db.users.find().sort({'age': 1, 'username': 1})

這里先根據(jù)age排序再根據(jù)username排序,所以username在這里發(fā)揮的作用并不大。為了優(yōu)化這個排序,可能需要在age和username上建立索引。

db.users.ensureIndex({'age':1, 'username': 1})
這就建立了一個復(fù)合索引(建立在多個字段上的索引),如果查詢條件包括多個鍵,這個索引就非常有用。

建立復(fù)合索引后,每個索引條目都包括一個age字段和一個username字段,并且指向文檔在磁盤上的存儲位置。
此時,age字段是嚴格升序排列的,如果age相等時再按照username升序排列。

查詢方式

點查詢(point query)

用于查詢單個值(盡管包含這個值的文檔可能有多個)

db.users.find({'age': 21}).sort({'username': -1})

因為我們已經(jīng)建立好復(fù)合索引,一個age一個username,建立索引時使用的是升序排序(即數(shù)字1),當(dāng)使用點查詢查找{age:21},假設(shè)仍然是10萬條數(shù)據(jù),可能年齡是21的很多人,因此會找到不只一條數(shù)據(jù)。然后sort({'username': -1})會對這些數(shù)據(jù)進行逆序排序,本意是這樣。但我們不要忘記建立索引時'username':1是升序(從小到大),如果想得到逆序只要對數(shù)據(jù)從最后一個索引開始,依次遍歷即可得到想要的結(jié)果。

排序方向并不重要,mongodb可以從任意方向?qū)λ饕M行遍歷。
綜上,復(fù)合索引在點查詢這種情況非常高效,直接定位年齡,不需要對結(jié)果進行排序,返回結(jié)果。

多值查詢(multi-value-query)

db.users.find({'age': {"$gte": 21, "$lte": 30}})

查找多個值相匹配的文檔。多值查詢也可以理解為多個點查詢。
如上,要查找年齡介于21到30之間。monogdb會使用索引的中的第一個鍵"age"得到匹配的結(jié)果,而結(jié)果通常是按照索引順序排列的。

db.users.find({'age': {"$gte": 21, "$lte": 30}}).sort({'username': 1})

與上一個類似,這次需要對結(jié)果排序。
在沒有sort時,我們查詢的結(jié)果首先是根據(jù)age等于21,age等于22..這樣從小到大排序,當(dāng)age等于21有多個時,在進行usernameA-Z(0-9)這樣排序。所以,sort({'username': 1}),要將所有結(jié)果通過名字升序排列,這次不得不先在內(nèi)存中進行排序,然后返回。效率不如上一個高。

當(dāng)然,在文檔非常少的情況,排序也花費不了多少時間。
如果結(jié)果集很大,比如超過32MB,MongoDB會拒絕對如此多的數(shù)據(jù)進行排序工作。

還有另外一種解決方案

也可以建立另外一個索引{'username': 1, 'age': 1}, 如果先對username建立索引,當(dāng)再sortusername,相當(dāng)沒有進行排序。但是需要在整個文檔查找age等于21的帥哥美女,所以搜尋時間就長了。

但哪個效率更高呢?

如果建立多個索引,如何選擇使用哪個呢?
效率高低是分情況的,如果在沒有限制的情況下,不用進行排序但需要搜索整個集合時間會遠超過前者。但是在返回部分數(shù)據(jù)(比如limit(1000)),新的贏家就產(chǎn)生了。

>db.users.find({'age': {"$gte": 21, "$lte": 30}}).sort({username': 1}).limit(1000).hint({'age': 1, 'username': 1})explain()['millis']2031ms>db.users.find({'age': {"$gte": 21, "$lte": 30}}).sort({username': 1}).limit(1000).hint({'username': 1, 'age': 1}).explain()['millis']181ms

其中可以使用hint指定要使用的索引。
所以這種方式還是很有優(yōu)勢的。比如一般場景下,我們不會把所有的數(shù)據(jù)都取出來,只是去查詢最近的,所以這種效率也會更高。

索引類型

唯一索引

可以確保集合的每個文檔的指定鍵都有唯一值。

db.users.ensureIndex({'username': 1, unique: true})
比如使用mongoose框架,在定義schema時,即可指定unique: true.
如果插入2個相同都叫張三的數(shù)據(jù),第二次插入的則會失敗。_id即為唯一索引,并且不能刪除。

稀疏索引

使用sparse可以創(chuàng)建稀疏索引

>db.users.ensureIndex({'email': 1}, {'unique': true, 'sparse': true})

索引管理

system.indexes集合中包含了每個索引的詳細信息

db.system.indexes.find()

1.ensureIndex()創(chuàng)建索引

db.users.ensureIndex({'username': 1})
后臺創(chuàng)建索引,這樣數(shù)據(jù)庫再創(chuàng)建索引的同時,仍然能夠處理讀寫請求,可以指定background選項。

db.test.ensureIndex({"username":1},{"background":true})

2.getIndexes()查看索引

db.collectionName.getIndexes()db.users.getIndexes()[  {    "v" : 1,    "key" : {      "_id" : 1    },    "ns" : "test.users",    "name" : "_id_"  },  {    "v" : 1,    "key" : {      "username" : 1    },    "ns" : "test.users",    "name" : "username_1"  }]

其中v字段只在內(nèi)部使用,用于標(biāo)識索引版本。

3.dropIndex刪除索引

> db.users.dropIndex("username_1"){ "nIndexesWas" : 2, "ok" : 1 }

全選復(fù)制放進筆記> db.users.dropIndex({"username":1})

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
亚洲成人a**站| 国产福利视频网站| 26uuu精品一区二区在线观看| 在线看你懂得| 人人狠狠综合久久亚洲婷| aa日韩免费精品视频一| 中文字幕亚洲日本| 亚洲av成人精品毛片| 天堂av免费在线观看| 男女污视频在线观看| 精品国产无码一区二区| √资源天堂中文在线| 韩国三级hd中文字幕| 91国产精品视频在线观看| 久久久久久久久久97| 一级日韩一区在线观看| 亚洲精品福利| 欧美一区二区三区四区久久| 亚洲天堂久久久| 亚洲高清不卡一区| 欧美日韩三区四区| 天天色图综合网| 国产精品白丝av嫩草影院| 一二三四在线观看视频韩国| 亚洲高潮无码久久| 欧美噜噜久久久xxx| 国产一区私人高清影院| 久久精品这里都是精品| 亚洲制服丝袜av| 亚洲电影天堂av| xvideos亚洲人网站| 久久激情综合| 久久久久亚洲AV成人无码国产| 800av在线播放| 日韩av日韩在线观看| 亚洲精品中文字幕乱码三区不卡| 日韩成人影院| 成网站在线观看人免费| 2020亚洲男人天堂| 自拍亚洲欧美老师丝袜| 国产韩日精品| 久久天天躁夜夜躁狠狠躁2022| 中文字幕日本在线观看| 午夜在线观看一区| 午夜精品在线免费观看| 欧美老女人第四色| 亚洲老板91色精品久久| 日本不卡一区| 国产精品久久久一区麻豆最新章节| 五十度飞在线播放| 国产一级黄色大片| 国产mv日韩mv欧美| 色综合天天综合给合国产| av在线不卡免费| av动漫在线播放| 1pondo在线播放免费| 99c视频在线| 国产高清免费在线播放| 性感美女一区二区在线观看| 15—17女人毛片| 久久久久久久久久久久久久久国产| 136国产福利精品导航| 高清在线一区| 色综合五月天导航| 免费成人av在线播放| 国产在线视频一区二区三区| 国产中文字幕免费观看| 天堂社区日本电影超碰| 西游记1978| 日韩一区二区三区不卡| 性色av一区二区三区免费| 久久av综合| 久久国产日本精品| 欧美电影免费网站| 国产精品自拍在线| 天堂va在线高清一区| 亚洲女人小视频在线观看| 日本在线不卡一区二区| 国产在线一区二区三区四区| 天码人妻一区二区三区在线看| 999国产精品| 91国产丝袜在线放| www.国产精品一二区| 亚洲天堂av一区二区| 亚洲日本一区二区| 日韩欧美午夜| 91麻豆精品国产91久久久更新资源速度超快| 免费看成人午夜电影| 九七影院97影院理论片久久| 羞羞影院体验区| 少妇av一区二区三区无码| 精品免费视频一区二区| 亚洲视频小说图片| 久久综合图片| 蜜臀久久99精品久久久无需会员| 性色一区二区三区| 欧美sm极限捆绑bd| 激情图片qvod| 黄色国产网站在线观看| 一道本在线视频| 三上悠亚影音先锋| 天天伊人狠狠| 欧美久久久久久久久久久久久久| 成人情趣视频网站| www.一区二区| 亚洲免费一级电影| 无码人妻精品一区二区蜜桃网站| 中文字幕在线观看网站| 久久久久久蜜桃一区二区| 男人最爱成人网| 91成人福利社区| 嫩草视频在线免费观看| 丁香婷婷综合激情| 亚洲精品久久久久久久蜜桃臀| 天堂中文在线播放| 国产精品美女诱惑| 久草视频国产在线| 欧美色综合影院| 国精产品一区一区三区四川| 国产精品久久久久久五月尺| 中文字幕日本乱码精品影院| 久久久久电影| 亚洲第一毛片| 亚洲精品久久久久avwww潮水| 毛片免费在线| 国产xxxx做受性欧美88| 嫩草影视亚洲| 亚洲天堂成人在线观看| 一个人看的视频www在线观看免费| 2018中文字幕第一页| 国产精品天堂| 欧美日韩国产精品一区二区三区四区| 国产在线不卡一区二区三区| 日本久久电影网| 佐佐木明希电影| 欧美成欧美va| 少妇荡乳情欲办公室456视频| 欧美成人小视频| 欧美大陆一区二区| 在线视频亚洲专区| 韩国一级黄色录像| 欧美精品九九久久| 久久久福利视频| 激情综合亚洲精品| 亚洲视频在线免费看| 亚洲免费看黄网站| 老司机午夜福利视频| 麻豆久久久av免费| 欧美激情视频在线观看| 久久久噜噜噜久噜久久综合| 成人久久精品视频| 动漫av一区| www.激情.com| 亚洲欧美日韩另类| 四虎国产成人免费观看| 成人性做爰aaa片免费看不忠| 少妇丰满尤物大尺度写真| 一区二区在线观看网站| 欧美日韩不卡中文字幕在线| 亚洲国产成人高清精品| 国产三级按摩推拿按摩| 国产精品黄页网站在线播放免费| 国产成人影院| 人人干视频在线| 欧美精品一区二区高清在线观看| 在线观看免费黄色网址| 欧美疯狂性受xxxxx喷水图片| 成人在线视频免费播放| 男女羞羞网站| 日韩少妇视频| 亚洲天堂资源| 九九热最新视频//这里只有精品| yw193.com尤物在线| 欧美黄色小视频| 挪威xxxx性hd极品| 日韩av不卡在线| 美女视频黄免费的久久| 日本亚洲视频在线| 欧美男男同志| 四虎免费在线观看| 91在线小视频| 中国xxx69视频| 国产一区二区中文字幕免费看| www.wu福利视频18| 久久精品无码人妻| 激情六月丁香婷婷| 国产淫片免费看| 欧美午夜美女看片| 天天色棕合合合合合合合| 国产欧美日韩一区二区三区在线| 欧美精品首页| 日本一区二区欧美| 美女主播精品视频一二三四| 污网站免费在线观看| 喷白浆一区二区| 国产亚洲精品码| 国产欧美精品在线观看| 久久精品欧美一区二区| 亚洲性视频网址| 老熟妇精品一区二区三区| 在线看的av网站| 性猛交娇小69hd| 国产精品a久久久久久| 中文字幕亚洲一区二区三区| 亚洲熟女一区二区三区| 日韩国产欧美在线观看| 亚洲一区二区三区视频| 亚洲欧美日韩精品一区二区| 欧美a一级片| 亚洲欧美精品一区二区| 先锋影视中文字幕| 欧美精品激情blacked18| 日本女优爱爱视频| 国产一级二级三级视频| 在线免费看av网站| 日日悠悠久久| 性欧美办公室18xxxxhd| 9999久久久久| 亚洲成a人片77777在线播放| 香蕉视频网站入口| 欧美美女黄视频| 福利视频午夜| 欧美丰满一区二区免费视频| 动漫3d精品一区二区三区乱码| 五月婷婷之综合激情| 日韩伦理在线一区| av成人在线网站| 影音先峰男人站| 成人噜噜噜噜| 国产日韩欧美一区二区三区| 色哟哟国产精品色哟哟| 99re国产| 久久综合免费视频影院| 网友自拍亚洲| 霍思燕三级露全乳照| 色狠狠久久av五月综合| 尤物视频在线视频| 久久综合第一页| 亚洲精品动态| 国产精品毛片一区二区三区四区| 中文字幕电影一区| 久久精品国产99久久99久久久| 中文字幕在线国产| 中文字字幕在线中文乱码| 久久久精品天堂| 在线一区二区不卡| 久草视频在线资源站| 视频一区二区三区入口| 亚洲欧美国产精品久久久久久久| 亚洲一区在线播放| 九色自拍视频在线观看| 久久久久久久国产精品| 日本精品视频在线观看| 色综合激情久久| 午夜激情在线| 成人高清电影网站| 91看片淫黄大片一级| 国产精品毛片一区二区在线看舒淇| 亚洲激情电影中文字幕| 国产午夜精品一区二区三区四区| 日韩一级在线视频| 午夜在线a亚洲v天堂网2018| 欧洲s码亚洲m码精品一区| 99热这里只有精品9| 亚洲国产成人精品电影| 欧美性猛交xxxx免费看| 水莓100在线视频| 日韩av电影在线网| 日本不卡不卡| 国产aⅴ夜夜欢一区二区三区| 一本一本久久| 国产九九精品视频| 九色中文视频| 视频一区二区在线| 国产99精品在线观看| 日本成人福利| 91欧美视频网站| 精品国产欧美日韩一区二区三区| 日韩av无码中文字幕| 女人丝袜激情亚洲| 亚洲 激情 在线| caoporn国产一区二区| 性8sex亚洲区入口| 强伦人妻一区二区三区| 91精品国产乱码久久久竹菊| av一级二级| 国产91沈先生在线播放| 91福利国产成人精品照片| 搡女人真爽免费午夜网站| 国产成人a亚洲精品| 亚洲一区二区三区四区精品| 日本中文字幕网| 国产白丝一区二区三区| 国产又粗又长又黄| 久久久久这里只有精品| 一区二区不卡在线视频 午夜欧美不卡在| 日韩欧美一级精品久久| 99re这里只有精品首页| 国产麻豆精品在线观看| 少妇精品高潮欲妇又嫩中文字幕| 99热这里精品| 久久在线电影| 国产美女久久久久久| 亚洲综合色在线观看| 亚洲欧美日韩国产综合精品二区| 午夜伦全在线观看| 国产麻豆视频免费观看| 久久夜靖品2区| 国产在线网站| 精品精品国产三级a∨在线| 日韩五码在线观看| 欧美黑人精品一区二区不卡| 成人一道本在线| 亚洲精品在线国产| 精品国产美女福利到在线不卡| 99精品免费观看| 999香蕉视频| 日韩一区二区三区免费| 亚欧美中日韩视频| 久久九九热免费视频| 国产乱码字幕精品高清av| 免费人成在线观看视频播放| 暖暖在线中文免费日本| 国产欧美精品国产国产专区| 亚洲天堂中文网| 伊人久久综合网另类网站| 92福利视频午夜1000合集在线观看| 视频一区视频二区欧美|