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