摘要:栗子在沒有索引的情況下查詢?nèi)勘本┸嚺铺?hào)碼返回結(jié)果如下哭表示全文檢索。該數(shù)據(jù)集包含了數(shù)據(jù),其中屬于北京車牌。栗子添加索引因?yàn)槲覀冎皇切枰玫奖本┦械能嚺铺?hào)碼,所以在我們的例子中涉及到了個(gè)索引信息,一個(gè)是城市另外一個(gè)就是車牌號(hào)碼。
本來是打算回答一個(gè)網(wǎng)友的問題,不過回復(fù)框太小而且功能不全(差評(píng)^o^),于是乎就成就了本文的產(chǎn)生。在這里我主要就是想跟大家分享一下我對(duì)Mongodb索引的粗淺理解,拋磚引玉,希望能對(duì)一些人有所幫助。
對(duì)于數(shù)據(jù)庫的索引相信大家都不陌生,主要功能就是在數(shù)據(jù)庫內(nèi)提高針對(duì)特定信息的訪問速度。那么在Mongodb里面索引是怎樣被引用跟查找的呢?下面我來通過幾個(gè)例子給大家分享一下我的心得體會(huì)。
Mongodb基礎(chǔ)數(shù)據(jù)查詢舉個(gè)栗子,按照城市查詢車牌號(hào)碼系統(tǒng)。為了方便演示,我在所有查詢后面都加入了explain()函數(shù)。要注意explain的返回結(jié)果集中的一下選項(xiàng):
cursor - 索引項(xiàng)
n - 查詢結(jié)果的條目總數(shù)
nscanned - 掃描并讀取的索引條目數(shù)(index)
nscannedObjects - 掃描并讀取的全文條目數(shù)(documents)
indexOnly - 是否使用了covered indexes功能,寶寶不哭,后面有詳述。
millis - 查詢用時(shí),單位是毫秒。
db.carLicence.find({city:"Beijing"}).explain() //返回結(jié)果如下: { "cursor" : "BasicCursor", "n" : 1563247, "nscannedObjects" : 96539732, "nscanned" : 96539732, "indexOnly" : false, "millis" : 156, // 哭! }
BasicCursor表示全文檢索。上面的例子說明,在沒有索引的情況下,該查詢語句查詢了整個(gè)數(shù)據(jù)集carLicence。該數(shù)據(jù)集包含了96539732數(shù)據(jù),其中1563247屬于北京車牌。整個(gè)用時(shí)為156毫秒.
小結(jié): 一定要避免沒有索引的全文查詢
db.carLicence.find({city:"Beijing"}).limit(1000).explain() //返回結(jié)果如下: { "cursor" : "BasicCursor", "n" : 1000, "nscannedObjects" : 18476396, "nscanned" : 18476396, "indexOnly" : false, "millis" : 85, // 擦干眼淚! }
這個(gè)例子說明,Mongodb在搜索滿1000個(gè)條目之后就停止繼續(xù)檢索了。
小結(jié): 盡量使用limit()來處理你的數(shù)據(jù)查詢。
因?yàn)槲覀冎皇切枰玫奖本┦械能嚺铺?hào)碼,所以在我們的例子中涉及到了2個(gè)索引信息,一個(gè)是城市city,另外一個(gè)就是車牌號(hào)碼licence。那么我們來給這2個(gè)信息添加索引,來查詢?nèi)勘本┸嚺铺?hào)碼。
db.carLicence.find({city:"Beijing"}).explain() //返回結(jié)果如下: { "cursor" : "BasicCursor city_1_licence_1", "n" : 1563247, "nscannedObjects" : 1563247, "nscanned" : 1563247, "indexOnly" : false, "millis" : 47, // 只剩 擦! }
相信看到這里,大家已經(jīng)對(duì)所有的功效有了一個(gè)初步的認(rèn)識(shí)了。
小結(jié) - 盡量給涉及到的條目建立索引。
那么,indexOnly的covered indexes功能會(huì)有什么樣的提高呢?好讓我們來看最后這個(gè)例子。
db.carLicence.find({city:"Beijing"}, {licence:1, _id:0}).explain() //返回結(jié)果如下: { "cursor" : "BasicCursor city_1_licence_1", "n" : 1563247, "nscannedObjects" : 0, "nscanned" : 1563247, "indexOnly" : true, // 變了 變了 ! "millis" : 41, // 擦!擦!擦! }
最后這個(gè)例子涉及到了covered indexes(覆蓋索引),通常來說,覆蓋索引只在查詢文檔的索引字段時(shí)候使用。但是有幾個(gè)特性跟附加條件要遵循.
查詢字段必須是索引字段
要去掉_id因?yàn)槭欠祷氐腛bject. 通過_id:0來實(shí)現(xiàn)。
索引字段不能是. 也就是說在explain()里面,如果isMultiKey:true的話indexOnly一定是false.
另外一個(gè)就是在最后一個(gè)栗子里面nscannedObjects是零,這是因?yàn)槲覀冎皇翘崛×怂饕锩娴哪夸洍llicence,并不需要每一條的全部數(shù)據(jù)(document),加上"indexOnly" : true,所以, Mongodb直接從索引里面提取了數(shù)據(jù)licence,不用再去查詢物理數(shù)據(jù)集carLicence得到相關(guān)全文信息。所以nscannedObjects為零。
小結(jié) - 在只提單字段數(shù)據(jù)的前提下,要給對(duì)應(yīng)的但字段建立索引索引。
結(jié)語粗淺的分析一下我對(duì)索引的理解跟一些優(yōu)化體驗(yàn)。有興趣的朋友可以共通研究。最后說一句,善用explain()能對(duì)你的優(yōu)化查詢有很大的益處。加油!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/18842.html
摘要:作為面試官,我是如何甄別應(yīng)聘者的包裝程度語言和等其他語言的對(duì)比分析和主從復(fù)制的原理詳解和持久化的原理是什么面試中經(jīng)常被問到的持久化與恢復(fù)實(shí)現(xiàn)故障恢復(fù)自動(dòng)化詳解哨兵技術(shù)查漏補(bǔ)缺最易錯(cuò)過的技術(shù)要點(diǎn)大掃盲意外宕機(jī)不難解決,但你真的懂?dāng)?shù)據(jù)恢復(fù)嗎每秒 作為面試官,我是如何甄別應(yīng)聘者的包裝程度Go語言和Java、python等其他語言的對(duì)比分析 Redis和MySQL Redis:主從復(fù)制的原理詳...
摘要:作為面試官,我是如何甄別應(yīng)聘者的包裝程度語言和等其他語言的對(duì)比分析和主從復(fù)制的原理詳解和持久化的原理是什么面試中經(jīng)常被問到的持久化與恢復(fù)實(shí)現(xiàn)故障恢復(fù)自動(dòng)化詳解哨兵技術(shù)查漏補(bǔ)缺最易錯(cuò)過的技術(shù)要點(diǎn)大掃盲意外宕機(jī)不難解決,但你真的懂?dāng)?shù)據(jù)恢復(fù)嗎每秒 作為面試官,我是如何甄別應(yīng)聘者的包裝程度Go語言和Java、python等其他語言的對(duì)比分析 Redis和MySQL Redis:主從復(fù)制的原理詳...
摘要:今天整理了一下近大半年以來的一些文章,和我的預(yù)期一樣,很多文章我都忘記自己曾經(jīng)寫過了,這個(gè)記錄的過程讓我也有了新的理解。希望大家,收藏,點(diǎn)贊,加轉(zhuǎn)發(fā)。 今天整理了一下近大半年以來的一些文章,和我的預(yù)期一樣,很多文章我都忘記自己曾經(jīng)寫過了,這個(gè)記錄的過程讓我也有了新的理解。希望大家,收藏,點(diǎn)贊,加轉(zhuǎn)發(fā)。 面試必備 面試必備:深入Spring MVC DispatchServlet 源碼...
摘要:今天整理了一下近大半年以來的一些文章,和我的預(yù)期一樣,很多文章我都忘記自己曾經(jīng)寫過了,這個(gè)記錄的過程讓我也有了新的理解。希望大家,收藏,點(diǎn)贊,加轉(zhuǎn)發(fā)。 今天整理了一下近大半年以來的一些文章,和我的預(yù)期一樣,很多文章我都忘記自己曾經(jīng)寫過了,這個(gè)記錄的過程讓我也有了新的理解。希望大家,收藏,點(diǎn)贊,加轉(zhuǎn)發(fā)。 面試必備 面試必備:深入Spring MVC DispatchServlet 源碼...
閱讀 679·2023-04-26 02:03
閱讀 1049·2021-11-23 09:51
閱讀 1161·2021-10-14 09:42
閱讀 1758·2021-09-13 10:23
閱讀 980·2021-08-27 13:12
閱讀 855·2019-08-30 11:21
閱讀 1013·2019-08-30 11:14
閱讀 1061·2019-08-30 11:09