成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

一起飛系列之:淺談Mongodb的索引優(yōu)化

arashicage / 3419人閱讀

摘要:栗子在沒有索引的情況下查詢?nèi)勘本┸嚺铺?hào)碼返回結(jié)果如下哭表示全文檢索。該數(shù)據(jù)集包含了數(shù)據(jù),其中屬于北京車牌。栗子添加索引因?yàn)槲覀冎皇切枰玫奖本┦械能嚺铺?hào)碼,所以在我們的例子中涉及到了個(gè)索引信息,一個(gè)是城市另外一個(gè)就是車牌號(hào)碼。

難度水平:初中級(jí)
適用人群:對(duì)Mongodb數(shù)據(jù)查詢已經(jīng)一定經(jīng)驗(yàn)的碼農(nóng),了解explain()的用法。
閱讀時(shí)間:10分鐘
緣起

本來是打算回答一個(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í),單位是毫秒。


栗子1: 在沒有索引的情況下查詢?nèi)勘本┸嚺铺?hào)碼
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é): 一定要避免沒有索引的全文查詢


栗子2: 在沒有索引的情況下,使用limit(1000)來查詢北京車牌號(hào)碼
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ù)查詢。


栗子3: 添加索引

因?yàn)槲覀冎皇切枰玫奖本┦械能嚺铺?hào)碼,所以在我們的例子中涉及到了2個(gè)索引信息,一個(gè)是城市city,另外一個(gè)就是車牌號(hào)碼licence。那么我們來給這2個(gè)信息添加索引,來查詢?nèi)勘本┸嚺铺?hào)碼。

注意:給2個(gè)以上的字段建立索引叫做Compound Index復(fù)合索引[多字段索引),hashed字段不能創(chuàng)建索引。建立方法如下db.carLicence.ensureIndex( { "city": 1, "licence": 1 } )
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è)例子。


栗子4: 使用覆蓋索引 Covered Indexes
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

相關(guān)文章

  • 【推薦】最新200篇:技術(shù)文章整理

    摘要:作為面試官,我是如何甄別應(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ù)制的原理詳...

    BicycleWarrior 評(píng)論0 收藏0
  • 【推薦】最新200篇:技術(shù)文章整理

    摘要:作為面試官,我是如何甄別應(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ù)制的原理詳...

    tommego 評(píng)論0 收藏0
  • 墻裂推薦:搜云庫技術(shù)團(tuán)隊(duì),面試必備技術(shù)干貨

    摘要:今天整理了一下近大半年以來的一些文章,和我的預(yù)期一樣,很多文章我都忘記自己曾經(jīng)寫過了,這個(gè)記錄的過程讓我也有了新的理解。希望大家,收藏,點(diǎn)贊,加轉(zhuǎn)發(fā)。 今天整理了一下近大半年以來的一些文章,和我的預(yù)期一樣,很多文章我都忘記自己曾經(jīng)寫過了,這個(gè)記錄的過程讓我也有了新的理解。希望大家,收藏,點(diǎn)贊,加轉(zhuǎn)發(fā)。 面試必備 面試必備:深入Spring MVC DispatchServlet 源碼...

    SegmentFault 評(píng)論0 收藏0
  • 墻裂推薦:搜云庫技術(shù)團(tuán)隊(duì),面試必備技術(shù)干貨

    摘要:今天整理了一下近大半年以來的一些文章,和我的預(yù)期一樣,很多文章我都忘記自己曾經(jīng)寫過了,這個(gè)記錄的過程讓我也有了新的理解。希望大家,收藏,點(diǎn)贊,加轉(zhuǎn)發(fā)。 今天整理了一下近大半年以來的一些文章,和我的預(yù)期一樣,很多文章我都忘記自己曾經(jīng)寫過了,這個(gè)記錄的過程讓我也有了新的理解。希望大家,收藏,點(diǎn)贊,加轉(zhuǎn)發(fā)。 面試必備 面試必備:深入Spring MVC DispatchServlet 源碼...

    Neilyo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<