亚洲精品久久久久久第一页-人妻少妇精彩视品一区二区三区-91国产自拍免费视频-免费一级a在线播放视频正片-少妇天天日天天射天天爽-国产大屁股喷水视频在线观看-操美女骚穴抽插性爱视频-亚洲 欧美 中文字幕 丝袜-成人免费无码片在线观看

mongodb是nosql數(shù)據(jù)庫嗎 9 NoSQL | MongoDB入門實(shí)戰(zhàn)教程


mongodb是nosql數(shù)據(jù)庫嗎 9 NoSQL | MongoDB入門實(shí)戰(zhàn)教程

文章插圖
| 總結(jié)/Edison Zhou
前面我們學(xué)習(xí)了如何套用常見的設(shè)計(jì)模式打造合適的模型設(shè)計(jì),本篇我們來看看在MongoDB中如何使用索引來提高查詢效率 。
1 MongoDB也有索引?
在使用傳統(tǒng)關(guān)系型數(shù)據(jù)庫如MSSQL、MySQL等的時(shí)候,我們經(jīng)常會為table中需要經(jīng)常查詢的字段建立index(索引) 。那么,MongoDB作為NoSQL的代表,是否也有索引呢?
答案是:有的 。
-- 查看集合的所有已有索引db.collectionName.getIndexes()MongoDB的兩種掃描方式
索引通常能夠極大的提高查詢的效率,如果沒有索引,MongoDB在讀取數(shù)據(jù)時(shí)會和MySQL一樣必須掃描集合中的每個(gè)文檔并選取那些符合查詢條件的記錄 。
mongodb是nosql數(shù)據(jù)庫嗎 9 NoSQL | MongoDB入門實(shí)戰(zhàn)教程

文章插圖
在MongoDB中,全集合掃描被稱之為 COLLSCAN,而索引掃描則被稱之為IXSCAN 。我們可以在MongoDB中使用類似于MySQL中的explain來查看執(zhí)行計(jì)劃,判斷該查詢是否是IXSCAN即索引掃描:
db.userinfos.find({name:"張三"}).explain()
mongodb是nosql數(shù)據(jù)庫嗎 9 NoSQL | MongoDB入門實(shí)戰(zhàn)教程

文章插圖
和關(guān)系型數(shù)據(jù)庫一樣,掃描全集合的查詢COLLSCAN的效率是非常低的,特別在處理大量的數(shù)據(jù)時(shí),查詢可以要花費(fèi)幾十秒甚至幾分鐘,這對網(wǎng)站的性能是非常致命的 。
MongoDB索引的數(shù)據(jù)結(jié)構(gòu):B樹
我們都知道MySQL InnoDB引擎的索引采用的是B+樹,那么MongoDB的索引采用的是什么數(shù)據(jù)結(jié)構(gòu)呢?
答案是:B樹 。
為什么MySQL采用B+樹,而MongoDB采用B樹呢?
首先,我們需要知道,什么是B樹,什么又是B+樹 。
(1)B+樹(MySQL等關(guān)系型數(shù)據(jù)庫廣泛采用)
mongodb是nosql數(shù)據(jù)庫嗎 9 NoSQL | MongoDB入門實(shí)戰(zhàn)教程

文章插圖
B+樹的兩個(gè)明顯特點(diǎn)
數(shù)據(jù)只出現(xiàn)在葉子節(jié)點(diǎn)(查詢效率高)所有葉子節(jié)點(diǎn)增加了一個(gè)鏈指針(便于范圍查詢)(2)B樹(MongoDB采用)
mongodb是nosql數(shù)據(jù)庫嗎 9 NoSQL | MongoDB入門實(shí)戰(zhàn)教程

文章插圖
B樹的兩個(gè)明顯特點(diǎn)
樹內(nèi)的每個(gè)節(jié)點(diǎn)都存儲數(shù)據(jù)葉子節(jié)點(diǎn)之間無指針相鄰針對上面的B+樹和B樹的特點(diǎn),我們可以得到以下兩個(gè)結(jié)論:(1) B樹的樹內(nèi)存儲數(shù)據(jù),因此查詢單條數(shù)據(jù)的時(shí)候,B樹的查詢效率不固定,最好的情況是O(1) 。我們可以認(rèn)為在做單一數(shù)據(jù)查詢的時(shí)候,使用B樹平均性能更好 。但是,由于B樹中各節(jié)點(diǎn)之間沒有指針相鄰,因此B樹不適合做一些數(shù)據(jù)遍歷操作 。
(2) B+樹的數(shù)據(jù)只出現(xiàn)在葉子節(jié)點(diǎn)上,因此在查詢單條數(shù)據(jù)的時(shí)候,查詢速度非常穩(wěn)定 。因此,在做單一數(shù)據(jù)的查詢上,其平均性能并不如B樹 。但是,B+樹的葉子節(jié)點(diǎn)上有指針進(jìn)行相連,因此在做數(shù)據(jù)遍歷的時(shí)候,只需要對葉子節(jié)點(diǎn)進(jìn)行遍歷即可,這個(gè)特性使得B+樹非常適合做范圍查詢 。
綜述,基于關(guān)系型數(shù)據(jù)庫的關(guān)系模型 和 文檔數(shù)據(jù)庫的文檔模型,我們可以知道:MySQL中數(shù)據(jù)遍歷操作比較多(因?yàn)樾枰啾黻P(guān)聯(lián)和范圍查找),所以用B+樹作為索引結(jié)構(gòu) 。而MongoDB是做單一文檔查詢比較多(因?yàn)閮?nèi)嵌設(shè)計(jì)不需要多集合關(guān)聯(lián)且很少范圍查找),數(shù)據(jù)遍歷操作比較少,所以用B樹作為索引結(jié)構(gòu) 。
MongoDB的索引查詢效率
由于B樹/B+樹的工作過程十分復(fù)雜,但本質(zhì)上,它是一個(gè)有序的數(shù)據(jù)結(jié)構(gòu) 。
我們可以用一個(gè)數(shù)組來理解它,假設(shè)這里有一個(gè)索引為{a:1}(a升序):
mongodb是nosql數(shù)據(jù)庫嗎 9 NoSQL | MongoDB入門實(shí)戰(zhàn)教程

文章插圖
在一個(gè)有序的結(jié)構(gòu)上,基于我們學(xué)習(xí)過的二分查找法,可以實(shí)現(xiàn)一個(gè)O(log2(n))的高效搜索效率 。這也可以解釋,為什么基于索引查詢,在數(shù)據(jù)量很大的情況下會快很多 。


以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請您及時(shí)就醫(yī)或請專業(yè)人士給予相關(guān)指導(dǎo)!

「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助: