中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

寫給MongoDB開發者的50條建議Tip22

發布時間:2020-06-02 14:19:28 來源:網絡 閱讀:937 作者:virusswb 欄目:MongoDB數據庫

本系列文章翻譯自《50 Tips and Tricks for MongoDB Developers》,暫時沒有找到中文版,反正自己最近也在深入學習mongodb,所以正好拿來翻譯一下。一方面加強自己學習的效果,另一方面讓大 家也一起來體驗一下需要我們這些mongodb使用者需要注意的地方。

首先聲明自己的英文水平不是太高,加之有些英文翻譯成中文也找不到合適的詞來表達,所以在文章中可能會出現英文原詞,或者說有些地方的翻譯會有些生 硬,也就是說會出現直譯的地方。翻譯該書的主要目的是為大家學習探討用的,如果有翻譯不精準的地方,或者說有更加精準的翻譯,還請大家指出,我會及時的更 正的,在此先謝過各位了。

Tip#22.Use indexes to do more with less memory

通過索引實現用較少的內存做更多的事情

圖22.1是一張查詢請求的示意圖。

 

寫給MongoDB開發者的50條建議Tip22

圖22.1 查詢流程圖

假設你有一臺機器,有256G的數據,16G的內存。大部分數據在一個集合中,并且你正在查詢這個集合。mongodb會怎么做呢?

假設每頁包含4K的數據。

mongodb將第一頁從磁盤加載到內存中,然后和你的查詢比較。然后再加載一頁,和你的查詢比較,再加載一頁。這樣會加載整個256G的數據。沒有什么捷徑,不查看文檔,它不知道那個文檔是匹配查詢請求的,因此它必須要查看所有的文檔才會知道那些文檔是符合查詢條件的。因此,需要加載所有256G的數據到內存中(操作系統需要把舊的數據交換出內存,需要加載新的數據)。這樣會花費很長的時間。

如何才能避免在一次查詢中不加載所有256G數據到內存呢?我們可以告訴mongodb在字段x上建立索引,mongodb會建立一棵樹,保存字段的值。mongodb會預處理這些數據,將集合中x字段的值都加到一個有序數中(如圖22.2)。樹的每個節點包含一個x的值,和指向包含x值的文檔的指針。

 

寫給MongoDB開發者的50條建議Tip22

圖22.2 有序B樹

樹只包含一個執行文檔的指針,而不是文檔本身,意味著索引要比整個集合小很多。

當你的查詢中包含x字段的時候,mongodb會注意到查詢條件中包含一個索引字段x,會通過有序樹來查詢x。現在,不是查找每一個文檔了。mongodb就回問,x是大于當前節點的值?還是小于當前節點的值?如果大于,就去右節點中繼續找;如果小于,就去左節點中繼續找。將會以這種方式繼續查找,直到找到節點值是x的節點。如果找到了,就會根據節點指針找到對應的文檔,返回文檔(如圖22.3)。

 

寫給MongoDB開發者的50條建議Tip22

圖22.3 一個包含值的索引指向一個文檔

如果不使用索引,我們需要加載6400萬頁的數據到內存中。

 

  1. Pages of data: 256G/(4KB/page)=64 million pages 

 

假設我們的索引是80G。索引是2000萬頁。

 

  1. Numbers of pages in our index: 80G/(4KB/page)=20 million pages 

因為索引是有序的,意味著我們不用查找每一個。我們只需要加載特定的節點。那么是多少呢?

 

  1. Numbers of pages of the index that must be loaded into memory: len(20,000,000)=17 pages 

從6400萬頁下降到17頁!

當然了,不只是17頁。一旦我們在索引中找到結果,就需要將對應的文檔加載到內存中,因此還需要加載文檔大小的頁。和之前的整個集合相比,還是小了很多。

希望你現在可以想象出索引對于加快查詢的幫助有多么大了。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

仁怀市| 海宁市| 昌乐县| 库车县| 米林县| 临沭县| 教育| 济南市| 商洛市| 巨野县| 察隅县| 上饶县| 安宁市| 孝义市| 宝丰县| 察雅县| 白河县| 玉树县| 吴旗县| 藁城市| 沙河市| 泽普县| 榆林市| 桂东县| 青州市| 德清县| 乐亭县| 延长县| 青铜峡市| 罗甸县| 确山县| 通河县| 台中市| 莱阳市| 洱源县| 万年县| 麟游县| 石狮市| 德格县| 宁化县| 廉江市|