您好,登錄后才能下訂單哦!
本系列文章翻譯自《50 Tips and Tricks for MongoDB Developers》,暫時沒有找到中文版,反正自己最近也在深入學(xué)習(xí)mongodb,所以正好拿來翻譯一下。一方面加強自己學(xué)習(xí)的效果,另一方面讓大 家也一起來體驗一下需要我們這些mongodb使用者需要注意的地方。
首先聲明自己的英文水平不是太高,加之有些英文翻譯成中文也找不到合適的詞來表達,所以在文章中可能會出現(xiàn)英文原詞,或者說有些地方的翻譯會有些生 硬,也就是說會出現(xiàn)直譯的地方。翻譯該書的主要目的是為大家學(xué)習(xí)探討用的,如果有翻譯不精準(zhǔn)的地方,或者說有更加精準(zhǔn)的翻譯,還請大家指出,我會及時的更 正的,在此先謝過各位了。
Tip#22.Use indexes to do more with less memory
通過索引實現(xiàn)用較少的內(nèi)存做更多的事情
圖22.1是一張查詢請求的示意圖。
圖22.1 查詢流程圖
假設(shè)你有一臺機器,有256G的數(shù)據(jù),16G的內(nèi)存。大部分?jǐn)?shù)據(jù)在一個集合中,并且你正在查詢這個集合。mongodb會怎么做呢?
假設(shè)每頁包含4K的數(shù)據(jù)。
mongodb將第一頁從磁盤加載到內(nèi)存中,然后和你的查詢比較。然后再加載一頁,和你的查詢比較,再加載一頁。這樣會加載整個256G的數(shù)據(jù)。沒有什么捷徑,不查看文檔,它不知道那個文檔是匹配查詢請求的,因此它必須要查看所有的文檔才會知道那些文檔是符合查詢條件的。因此,需要加載所有256G的數(shù)據(jù)到內(nèi)存中(操作系統(tǒng)需要把舊的數(shù)據(jù)交換出內(nèi)存,需要加載新的數(shù)據(jù))。這樣會花費很長的時間。
如何才能避免在一次查詢中不加載所有256G數(shù)據(jù)到內(nèi)存呢?我們可以告訴mongodb在字段x上建立索引,mongodb會建立一棵樹,保存字段的值。mongodb會預(yù)處理這些數(shù)據(jù),將集合中x字段的值都加到一個有序數(shù)中(如圖22.2)。樹的每個節(jié)點包含一個x的值,和指向包含x值的文檔的指針。
圖22.2 有序B樹
樹只包含一個執(zhí)行文檔的指針,而不是文檔本身,意味著索引要比整個集合小很多。
當(dāng)你的查詢中包含x字段的時候,mongodb會注意到查詢條件中包含一個索引字段x,會通過有序樹來查詢x。現(xiàn)在,不是查找每一個文檔了。mongodb就回問,x是大于當(dāng)前節(jié)點的值?還是小于當(dāng)前節(jié)點的值?如果大于,就去右節(jié)點中繼續(xù)找;如果小于,就去左節(jié)點中繼續(xù)找。將會以這種方式繼續(xù)查找,直到找到節(jié)點值是x的節(jié)點。如果找到了,就會根據(jù)節(jié)點指針找到對應(yīng)的文檔,返回文檔(如圖22.3)。
圖22.3 一個包含值的索引指向一個文檔
如果不使用索引,我們需要加載6400萬頁的數(shù)據(jù)到內(nèi)存中。
- Pages of data: 256G/(4KB/page)=64 million pages
假設(shè)我們的索引是80G。索引是2000萬頁。
- Numbers of pages in our index: 80G/(4KB/page)=20 million pages
因為索引是有序的,意味著我們不用查找每一個。我們只需要加載特定的節(jié)點。那么是多少呢?
- Numbers of pages of the index that must be loaded into memory: len(20,000,000)=17 pages
從6400萬頁下降到17頁!
當(dāng)然了,不只是17頁。一旦我們在索引中找到結(jié)果,就需要將對應(yīng)的文檔加載到內(nèi)存中,因此還需要加載文檔大小的頁。和之前的整個集合相比,還是小了很多。
希望你現(xiàn)在可以想象出索引對于加快查詢的幫助有多么大了。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。