亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

arashicage / 3467人閱讀

摘要:栗子在沒有索引的情況下查詢?nèi)勘本┸嚺铺柎a返回結(jié)果如下哭表示全文檢索。該數(shù)據(jù)集包含了數(shù)據(jù),其中屬于北京車牌。栗子添加索引因為我們只是需要得到北京市的車牌號碼,所以在我們的例子中涉及到了個索引信息,一個是城市另外一個就是車牌號碼。

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

本來是打算回答一個網(wǎng)友的問題,不過回復(fù)框太小而且功能不全(差評^o^),于是乎就成就了本文的產(chǎn)生。在這里我主要就是想跟大家分享一下我對Mongodb索引的粗淺理解,拋磚引玉,希望能對一些人有所幫助。

對于數(shù)據(jù)庫的索引相信大家都不陌生,主要功能就是在數(shù)據(jù)庫內(nèi)提高針對特定信息的訪問速度。那么在Mongodb里面索引是怎樣被引用跟查找的呢?下面我來通過幾個例子給大家分享一下我的心得體會。

Mongodb基礎(chǔ)數(shù)據(jù)查詢

舉個栗子,按照城市查詢車牌號碼系統(tǒng)。為了方便演示,我在所有查詢后面都加入了explain()函數(shù)。要注意explain的返回結(jié)果集中的一下選項:

cursor - 索引項

n - 查詢結(jié)果的條目總數(shù)

nscanned - 掃描并讀取的索引條目數(shù)(index)

nscannedObjects - 掃描并讀取的全文條目數(shù)(documents)

indexOnly - 是否使用了covered indexes功能,寶寶不哭,后面有詳述。

millis - 查詢用時,單位是毫秒。


栗子1: 在沒有索引的情況下查詢?nèi)勘本┸嚺铺柎a
db.carLicence.find({city:"Beijing"}).explain()

//返回結(jié)果如下:
{
  "cursor" : "BasicCursor",
  "n" : 1563247,
  "nscannedObjects" : 96539732,
  "nscanned" : 96539732,
  "indexOnly" : false,
  "millis" : 156, // 哭!
}

BasicCursor表示全文檢索。上面的例子說明,在沒有索引的情況下,該查詢語句查詢了整個數(shù)據(jù)集carLicence。該數(shù)據(jù)集包含了96539732數(shù)據(jù),其中1563247屬于北京車牌。整個用時為156毫秒.

小結(jié): 一定要避免沒有索引的全文查詢


栗子2: 在沒有索引的情況下,使用limit(1000)來查詢北京車牌號碼
db.carLicence.find({city:"Beijing"}).limit(1000).explain()

//返回結(jié)果如下:
{
  "cursor" : "BasicCursor",
  "n" : 1000,
  "nscannedObjects" : 18476396,
  "nscanned" : 18476396,
  "indexOnly" : false,
  "millis" : 85, // 擦干眼淚!
}

這個例子說明,Mongodb在搜索滿1000個條目之后就停止繼續(xù)檢索了。

小結(jié): 盡量使用limit()來處理你的數(shù)據(jù)查詢。


栗子3: 添加索引

因為我們只是需要得到北京市的車牌號碼,所以在我們的例子中涉及到了2個索引信息,一個是城市city,另外一個就是車牌號碼licence。那么我們來給這2個信息添加索引,來查詢?nèi)勘本┸嚺铺柎a。

注意:給2個以上的字段建立索引叫做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)對所有的功效有了一個初步的認(rèn)識了。

小結(jié) - 盡量給涉及到的條目建立索引。

那么,indexOnly的covered indexes功能會有什么樣的提高呢?好讓我們來看最后這個例子。


栗子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, // 擦!擦!擦!
}

最后這個例子涉及到了covered indexes(覆蓋索引),通常來說,覆蓋索引只在查詢文檔的索引字段時候使用。但是有幾個特性跟附加條件要遵循.

查詢字段必須是索引字段

要去掉_id因為是返回的Object. 通過_id:0來實(shí)現(xiàn)。

索引字段不能是. 也就是說在explain()里面,如果isMultiKey:true的話indexOnly一定是false.

另外一個就是在最后一個栗子里面nscannedObjects是零,這是因為我們只是提取了索引里面的目錄條licence,并不需要每一條的全部數(shù)據(jù)(document),加上"indexOnly" : true,所以, Mongodb直接從索引里面提取了數(shù)據(jù)licence,不用再去查詢物理數(shù)據(jù)集carLicence得到相關(guān)全文信息。所以nscannedObjects為零。

小結(jié) - 在只提單字段數(shù)據(jù)的前提下,要給對應(yīng)的但字段建立索引索引。

結(jié)語

粗淺的分析一下我對索引的理解跟一些優(yōu)化體驗。有興趣的朋友可以共通研究。最后說一句,善用explain()能對你的優(yōu)化查詢有很大的益處。加油!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/18842.html

相關(guān)文章

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

    摘要:作為面試官,我是如何甄別應(yīng)聘者的包裝程度語言和等其他語言的對比分析和主從復(fù)制的原理詳解和持久化的原理是什么面試中經(jīng)常被問到的持久化與恢復(fù)實(shí)現(xiàn)故障恢復(fù)自動化詳解哨兵技術(shù)查漏補(bǔ)缺最易錯過的技術(shù)要點(diǎn)大掃盲意外宕機(jī)不難解決,但你真的懂?dāng)?shù)據(jù)恢復(fù)嗎每秒 作為面試官,我是如何甄別應(yīng)聘者的包裝程度Go語言和Java、python等其他語言的對比分析 Redis和MySQL Redis:主從復(fù)制的原理詳...

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

    摘要:作為面試官,我是如何甄別應(yīng)聘者的包裝程度語言和等其他語言的對比分析和主從復(fù)制的原理詳解和持久化的原理是什么面試中經(jīng)常被問到的持久化與恢復(fù)實(shí)現(xiàn)故障恢復(fù)自動化詳解哨兵技術(shù)查漏補(bǔ)缺最易錯過的技術(shù)要點(diǎn)大掃盲意外宕機(jī)不難解決,但你真的懂?dāng)?shù)據(jù)恢復(fù)嗎每秒 作為面試官,我是如何甄別應(yīng)聘者的包裝程度Go語言和Java、python等其他語言的對比分析 Redis和MySQL Redis:主從復(fù)制的原理詳...

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

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

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

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

    Neilyo 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<