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

資訊專欄INFORMATION COLUMN

MongoDB索引與優(yōu)化詳解

oujie / 2376人閱讀

摘要:全文索引在中每個(gè)集合只允許創(chuàng)建一個(gè)索引,因此不用擔(dān)心存在多個(gè)索引造成沖突的問題。全文索引創(chuàng)建全文索引創(chuàng)建方法與創(chuàng)建單鍵索引復(fù)合索引類似。

在MongoDB中通過建立索引可以進(jìn)行高效的查詢,如果沒有索引MongoDB將會(huì)掃描整個(gè)集合與查詢的條件進(jìn)行匹配,這對(duì)于性能會(huì)造成很大的消耗。

技術(shù)博客: Node.js技術(shù)棧

快速導(dǎo)航

Mongodb索引類型

索引屬性

索引實(shí)例測(cè)試

索引(Index)創(chuàng)建導(dǎo)致的庫級(jí)鎖問題

面試指南

生產(chǎn)環(huán)境如何正確創(chuàng)建索引? ,參考:#

Mongodb索引類型
MongoDB提供了不同的索引類型支持在不同的業(yè)務(wù)場(chǎng)景進(jìn)行查詢
1. _id索引
絕大多數(shù)集合默認(rèn)建立索引,對(duì)于每個(gè)插入的數(shù)據(jù),MongoDB都會(huì)生成一條唯一的_id字段。

例如新創(chuàng)建一個(gè)集合時(shí)

db.demo_admin2.insert({x:1})
db.demo_admin2.getIndexes() # 查看集合索引,可看到_id索引
2. 單鍵索引
是最普通的索引,單鍵索引不會(huì)自動(dòng)創(chuàng)建

例如一條記錄形式為:{x:1,y:2,z:3},只要在x字段上建立索引之后,就可以用x為條件進(jìn)行查詢

db.demo_admin2.ensureIndex({x:1}) # 創(chuàng)建索引
db.demo_admin2.find({x:1}); # 使用索引查詢
3. 多鍵索引
多鍵索引與單鍵索引區(qū)別在于多鍵索引的值具有多個(gè)記錄,是一個(gè)數(shù)組
db.demo_admin2.insert({x:[1,2,3,4]})
4. 復(fù)合索引
當(dāng)查詢條件為多個(gè)時(shí),需要建立復(fù)合索引

插入記錄{"x":1,"y":2,"z":3}

db.demo_admin2.insert({"x":1,"y":2,"z":3});

創(chuàng)建索引

db.demo_3.ensureIndex({x:1,y:1}) # 1升序,-1降序

使用{x:1,y:1}作為條件進(jìn)行查詢

db.demo_admin2.find({x:1,y:2})
5. 過期索引
指在一段時(shí)間后會(huì)過期的索引,此索引過一段時(shí)間會(huì)過期,索引過期后,相應(yīng)的數(shù)據(jù)會(huì)被刪除,適合存儲(chǔ)一些在一段時(shí)間之后會(huì)失效的數(shù)據(jù),比如用戶登錄信息,這樣就不需要用到session了。

5.1 創(chuàng)建過期索引

建立索引的時(shí)候需要多用一個(gè)參數(shù),指定索引的有效時(shí)間——expireAfterSeconds,單位為秒

如下示例為time字段創(chuàng)建過期索引

db.demo_3.ensureIndex({time:1},{expireAfterSeconds:10})

5.2 過期索引限制

過期索引字段值必須是指定的時(shí)間類型,必須是ISODate或ISODate數(shù)組,不能使用時(shí)間戳,否則不能被自動(dòng)刪除。

如果指定了ISODate數(shù)組,則按照最小的時(shí)間進(jìn)行刪除。 過期索引不能是復(fù)合索引。

刪除時(shí)間不是精確的,刪除過程是由后臺(tái)程序每60s跑一次,而且刪除也需要一些時(shí)間,所以存在誤差。

db.demo_3.ensureIndex({time:1},{expireAfterSeconds:30}
db.demo_3.insert({time:new Date()});
6. 全文索引
在mongodb中每個(gè)集合只允許創(chuàng)建一個(gè)索引,因此不用擔(dān)心存在多個(gè)索引造成沖突的問題。

6.1 全文索引創(chuàng)建

全文索引創(chuàng)建方法與創(chuàng)建單鍵索引、復(fù)合索引類似。value換成"text",$**匹配集合下所有

為一個(gè)字段創(chuàng)建全文索引

db.articles.ensureIndex({key:"text"})

為多個(gè)字段創(chuàng)建全文索引

db.articles.ensureIndex({key_1:"text"},{key_2:"text"})

為集合中所有的字段創(chuàng)建全文索引

db.articles.ensureIndex({"$**":"text"})

6.2 實(shí)例

建立索引

db.article.ensureIndex({"article":"text"})
db.articles.find({$text:{$search:"coffee"}})
db.articles.find({$text:{$search:"aa bb cc"}}) # 包含aa或bb或cc的數(shù)據(jù)
db.articles.find({$text:{$search:"aa bb -cc"}}) # 同時(shí)包含aa、bb且不包含cc的數(shù)據(jù)
db.articles.find({$text:{$search:""aa" "bb" "cc""}})# 同時(shí)包含aa、bb、cc的數(shù)據(jù)(用""包裹起來,引號(hào)需要用反斜杠轉(zhuǎn)義)

6.3 mongodb相似度查詢

$meta操作符:{score:{$meta:"textScore"}}

查詢結(jié)果的相似度,搜索出的結(jié)果會(huì)多出一個(gè)score字段,這個(gè)得分越高,相關(guān)度越高。

db.article.find({$text:{$search:"aa bb ff"}},{score:{$meta:"textScore"}})

加上.sort方法可排序

db.article.find({$text:{$search:"aa bb ff"}},{score:{$meta:"textScore"}}).sort({score:{$meta:"textScore"}})

6.4 全局索引的限制

每次查詢,只能指定一個(gè)$text查詢

$text查詢不能出現(xiàn)在$nor查詢中

查詢中如果包含了$text, hint不再起作用

MongoDB全文索引還不支持中文

7.地理位置索引

2d索引,用于存儲(chǔ)和查找平面上的點(diǎn)

2dsphere索引,用于存儲(chǔ)和查找球面上的點(diǎn)

索引屬性

1.索引屬性name

MongoDB會(huì)自動(dòng)的創(chuàng)建,規(guī)則是key_1 或者 key_-1  1或者-1代表排序方向,一般影響不大,長(zhǎng)度一般有限制125字節(jié)
db.collection.ensureIndex({indexValue},{name: key})

為了見名知意我們可以自己來命名

db.demo_3.ensureIndex({x:1,y:1,z:1,n:1},{name:"xyz-name"});

刪除索引

db.demo_3.dropIndex(indexName)

2. 索引屬性u(píng)nique唯一性指定

類似關(guān)系型數(shù)據(jù)庫字段的唯一約束
db.demo_3.ensureIndex({m:1,n:1},{unique:true})
索引實(shí)例測(cè)試
建立500萬條數(shù)據(jù),分別用來測(cè)試建立索引和未建立索引的差別,只有在大量數(shù)據(jù)下才有效果,以下的示例中的時(shí)間消耗值,各電腦配置的不同在不同電腦上測(cè)試也會(huì)有不同的差別。

建立測(cè)試數(shù)據(jù)

> for(var i=0; i<5000000; i++) db.demo_user.insert({id: i})
WriteResult({ "nInserted" : 1 })

未建立索引情況數(shù)據(jù)查詢

在未建立索引的情況下,執(zhí)行數(shù)據(jù)查詢的時(shí)間消耗在6秒多。

建立索引情況查詢數(shù)據(jù)

db.getCollection("demo_user").ensureIndex({"id": 1}) # 建立索引

下圖為建立索引的情況,在數(shù)據(jù)查詢中僅用了0.001秒,可見建立索引的重要的性。

索引導(dǎo)致的庫級(jí)鎖

這是一個(gè)很坑爹的事情,MongoDB沒有像MySql、Oracle擁有行級(jí)粒度鎖概念,在MongoDB中只有庫級(jí)粒度鎖概念,意味這當(dāng)你在生產(chǎn)環(huán)境中不小心觸發(fā)了一個(gè)寫鎖的操作時(shí)其它的業(yè)務(wù)也會(huì)受影響。

MongoDB中建立索引就是一個(gè)觸發(fā)寫鎖的過程,通常數(shù)據(jù)量越大建立的索引占用的寫鎖時(shí)間就會(huì)越長(zhǎng),MongoDB中建立索引的兩種方式。

前臺(tái)創(chuàng)建(錯(cuò)誤)

以下為前臺(tái)建立索引演示可以看到在執(zhí)行創(chuàng)建索引命令之后,新打開一個(gè)終端查詢另一張表一直處于等待狀態(tài),直到創(chuàng)建索引完成才返回?cái)?shù)據(jù)。

db.getCollection("demo_user").ensureIndex({"id": 1}) # 建立索引

后臺(tái)創(chuàng)建(推薦)

基于后臺(tái)創(chuàng)建索引的方式在執(zhí)行創(chuàng)建索引命令之后,新開一個(gè)終端查詢另一個(gè)集合中的數(shù)據(jù)可以立即得到返回。

db.getCollection("demo_user").ensureIndex({"id": 1}, {background: 1}) # 建立索引

作者:五月君
鏈接:https://www.imooc.com/article...
來源:首發(fā)慕課網(wǎng)
Github: Node.js技術(shù)棧

推薦閱讀

MongoDB Indexes

Github:MongoDB索引

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/19518.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

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

0條評(píng)論

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