1. <th id="k6j97"></th>
      2. <ol id="k6j97"></ol><s id="k6j97"></s>
      3. 主頁 > 知識庫 > Mongodb索引的優化

        Mongodb索引的優化

        熱門標簽:百度競價排名 網站排名優化 地方門戶網站 呼叫中心市場需求 鐵路電話系統 Linux服務器 服務外包 AI電銷

        MongoDB 是一個基于分布式文件存儲的數據庫。由 C++ 語言編寫。旨在為 WEB 應用提供可擴展的高性能數據存儲解決方案。MongoDB索引幾乎和關系型數據庫的索引一樣.MongoDB的查詢優化器能夠使用這種數據結構來快速的對集合(collection)中的文檔(collection)進行尋找和排序.準確來說,這些索引是通過B-Tree索引來實現的。在命令行中,可以通過調用ensureIndex()函數來建立索引,該函數指定一個到多個需要索引的字段,下面介紹mongodb索引如何優化

        一、索引簡介

        例如如下數據

        db.refactor.insert({"username":"refactor","age":24,"isactive":true})
        db.refactor.insert({"username":"refactor","age":30,"isactive":false})
        db.refactor.insert({"username":"aaaaa","age":24,"isactive":false})
        db.refactor.insert({"username":"aaaaa","age":34,"isactive":true})
        db.refactor.insert({"username":"sssssss","age":24,"isactive":true})
        db.refactor.insert({"username":"tttttt","age":24,"isactive":true})
        db.refactor.insert({"username":"tttttt","age":54,"isactive":true})
        db.refactor.insert({"username":"bbbbb","age":24,"isactive":false})
        db.refactor.insert({"username":"rrrrr","age":24,"isactive":true})
        db.refactor.insert({"username":"rrrrr","age":54,"isactive":false})

        要按照username鍵進行查找,就可以在此鍵上建立索引,來提高查詢速度.

        db.refactor.ensureIndex({"username":1})

        要按照username,age鍵進行查找,就可以在此鍵上建立索引,來提高查詢速度.

        db.refactor.ensureIndex({"age":1,"username":1})

        傳遞給ensureIndex的文檔是一組值為1或-1的鍵,1為升序,-1為降序,表示索引的創建方向.若索引只有一個鍵,則方向無關緊要.

        若是有多個鍵,就得考慮索引的方向問題了.

        二、mongodb自帶的就有監控,根據這些監控信息,可以做為優化的依據

        1、explain執行計劃

        MongoDB提供了一個explain命令讓我們獲知系統如何處理查詢請求。利用explain命令,我們可以很好地觀察系統如何使用索引來加快檢索同時可以針對性優化索引。

        幾個關鍵的字段說明

        cursor:返回游標類型(BasicCursor或BtreeCursor)
        nscanned:被掃描的文檔數量
        n:返回的文檔數量
        millis:耗時(毫秒)
        indexBounds:所使用的索引

        例如

        SQL 代碼

        >db.order.ensureIndex({"user.uid":1})
        
        >db.order.find({ "status": 1.0, "user.uid": { $gt: 2663199.0 } }).explain() 
        { 
        "cursor" : "BtreeCursor user.uid_1", 
        "nscanned" : 337800, 
        "nscannedObjects" : 337800, 
        "n" : 337800, 
        "millis" : 1371, 
        "nYields" : 0, 
        "nChunkSkips" : 0, 
        "isMultiKey" : false, 
        "indexOnly" : false, 
        "indexBounds" : { 
        "user.uid" : [ 
        [ 
        2663199, 
        1.7976931348623157e+308 
        ] 
        ] 
        } 
        }

        2、優化器profile

        在MySQL中慢查詢日志是經常作為我們優化數據庫的依據那在MongoDB中是否有類似的功能呢?答案是肯定的那就是MongoDBDatabaseProfiler。所以MongoDB不僅有而且還有一些比MySQL的SlowQueryLog更詳細的信息。
        mongodb把要輸出的慢語句,存在于db.system.profile。與mysql的slowlog配置相似,需要進行參數設置,mongo才會輸出慢語句到profile。有兩個參數來控制profile的輸出
        db.setProfilingLevel(level,slowms);

        默認為0 不輸出 1按第二個參數時間閥值(單位為毫秒)輸出 2全部輸出。通常我們在調優的時候都在測試環境打開參數。在生產環境下一般不輸出profile。

        比如

        > db.system.profile.find({millis:{$gt:1000}})

        就可以輸出,查詢時間大于1秒的慢語句。

        profile輸出的各項值的含義是

        ts:命令執行時間
        info:命令的內容
        query:代表查詢
        order.order: 代表查詢的庫與集合
        reslen:返回的結果集大小,byte數
        nscanned:掃描記錄數量
        nquery:后面是查詢條件
        nreturned:返回記錄數及用時
        millis:所花時間

        如果發現時間比較長,那么就需要作優化。

        比如

        (1)、nscanned數很大,或者接近記錄總數,那么可能沒有用到索引查詢。

        (2)、reslen很大,有可能返回沒必要的字段。

        (3)、nreturned很大,那么有可能查詢的時候沒有加限制。

        三、MongoDB的索引選擇機制

        MongoDB的優化程序會在對比中選擇更優秀的索引。

        首先,它會給查詢做一個初步的“最佳索引”;

        其次,假如這個最佳索引不存在它會做嘗試來選出表現最好的索引;

        最后,優化器還會記住所有類似查詢的選擇(只到大規模文件變動或者索引上的變動)。

        那么優化器是如何定義查詢的“最佳索引”。最佳索引必須包含查詢中所有可以做過濾及需要排序的字段。此外任何用于范圍掃描的字段以及排序字段都必須排在做等值查詢的字段之后。如果存在不同的最佳索引,那么Mongo將隨機選擇。

        四、MongoDB的索引總結

        1. 等值測試

        索引中加入所有需要做等值測試的字段,任意順序。

        2. 排序字段(多排序字段的升/降序問題 )

        根據查詢的順序有序的向索引中添加字段。

        3. 范圍過濾

        以字段的基數(Collection中字段的不同值的數量)從低到高的向索引中添加范圍過濾字段。

        4、如果索引中的等值或者范圍查詢字段不能過濾出Collection中90%以上的文檔,那么把它移除索引估計會更好一些。

        5、索引使得可以通過關鍵字段獲取數據,能夠使得快速查詢和更新數據。但是,必須注意的是,索引也會在插入和刪除的時候增加一些系統的負擔。往集合中插入數據的時候,索引的字段必須加入到B-Tree中去,因此,索引適合建立在讀遠多于寫的數據集上,對于寫入頻繁的集合,在某些情況下,索引反而有副作用。不過大多數集合都是讀頻繁的集合,所以集合在大多數情況下是有用的。

        6、如果數據集合比較?。ㄍǔP∮?M),使用sort()而不需要建立索引就能夠返回數據。在這種情況下,做好聯合使用limit()和sort()。

        關于Mongodb索引的優化就給大家介紹這么多,希望對大家有所幫助!

        您可能感興趣的文章:
        • MongoDB索引使用詳解
        • MongoDB的基礎查詢和索引操作方法總結
        • MongoDB中唯一索引(Unique)的那些事
        • MongoDB中創建索引需要注意的事項
        • mongodb處理中文索引與查找字符串詳解
        • 深入理解MongoDB的復合索引
        • MongoDB通配符索引的用法實例

        標簽:湘潭 衡水 蘭州 崇左 湖南 仙桃 黃山 銅川

        巨人網絡通訊聲明:本文標題《Mongodb索引的優化》,本文關鍵詞  ;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
      4. 相關文章
      5. 收縮
        • 微信客服
        • 微信二維碼
        • 電話咨詢

        • 400-1100-266