MongoDB 提升性能的18原則(開發設計階段)

来源:https://www.cnblogs.com/xuliuzai/archive/2018/09/11/9631761.html
-Advertisement-
Play Games

MongoDB 是高性能數據,但是在使用的過程中,大家偶爾還會碰到一些性能問題。MongoDB和其它關係型資料庫相比,例如 SQL Server 、MySQL 、Oracle 相比來說,相對較新,很多人對其不是很熟悉,所以很多開發、DBA往往是註重功能的實現,而忽視了性能的要求。其實,MongoDB ...


MongoDB 是高性能數據,但是在使用的過程中,大家偶爾還會碰到一些性能問題。MongoDB和其它關係型資料庫相比,例如 SQL Server 、MySQL 、Oracle 相比來說,相對較新,很多人對其不是很熟悉,所以很多開發、DBA往往是註重功能的實現,而忽視了性能的要求。其實,MongoDB和 SQL Server 、MySQL 、Oracle 一樣,一個 資料庫對象的設計調整、索引的創建、語句的優化,都會對性能產生巨大的影響。

為了充分挖掘MongoDB性能,現簡單總計了以下18條,歡迎大家一起來持續總結完善。

 

(1)  文檔中的_id鍵推薦使用預設值,禁止向_id中保存自定義的值。

    解讀:MongoDB文檔中都會有一個“_id”鍵,預設是個ObjectID對象(標識符中包含時間戳、機器ID、進程ID和計數器)。MongoDB在指定_id與不指定_id插入時      速度相差很大,指定_id會減慢插入的速率。

 

(2)  推薦使用短欄位名。

           解讀:與關係型資料庫不同,MongoDB集合中的每一個文檔都需要存儲欄位名,長欄位名會需要更多的存儲空間。

 

(3)  MongoDB索引可以提高文檔的查詢、更新、刪除、排序操作,所以結合業務需求,適當創建索引。

 

(4)  每個索引都會占用一些空間,並且導致插入操作的資源消耗,因此,建議每個集合的索引數儘量控制在5個以內。

 

(5)  對於包含多個鍵的查詢,創建包含這些鍵的複合索引是個不錯的解決方案。複合索引的鍵值順序很重要,理解索引最左首碼原則。

 

解讀:例如在test集合上創建組合索引{a:1,b:1,c:1}。執行以下7個查詢語句:

  1. db.test.find({a:”hello”})
  2. db.test.find({b:”sogo”, a:”hello”})
  3. db.test.find({a:”hello”,b:”sogo”, c:”666”})
  4. db.test.find({c:”666”, a:”hello”})
  5. db.test.find({b:”sogo”, c:”666”})
  6. db.test.find({b:”sogo” })
  7. db.test.find({c:”666”})
  • 以上查詢語句可能走索引的是1、2、3、4
  • 查詢應包含最左索引欄位,以索引創建順序為準,與查詢欄位順序無關。
  •  最少索引覆蓋最多查詢。

 

(6) TTL 索引(time-to-live index,具有生命周期的索引),使用TTL索引可以將超時時間的文檔老化,一個文檔到達老化的程度之後就會被刪除。

解讀:創建TTL的索引必須是日期類型。TTL索引是一種單欄位索引,不能是複合索引。TTL刪除文檔後臺線程每60s移除失效文檔。不支持定長集合。

 

(7) 需要在集合中某欄位創建索引,但集合中大量的文檔不包含此鍵值時,建議創建稀疏索引。

解讀:索引預設是密集型的,這意味著,即使文檔的索引欄位缺失,在索引中也存在著一個對應關係。在稀疏索引中,只有包含了索引鍵值的文檔才會出現。

 

(8)  創建文本索引時欄位指定text,而不是1或者-1。每個集合只有一個文本索引,但是它可以為任意多個欄位建立索引。

解讀:文本搜索速度快很多,推薦使用文本索引替代對集合文檔的多欄位的低效查詢。

 

(9)  使用findOne在資料庫中查詢匹配多個項目,它就會在自然排序文件集合中返回第一個項目。如果需要返回多個文檔,則使用find方法。

 

(10) 如果查詢無需返回整個文檔或只是用來判斷鍵值是否存在,可以通過投影(映射)來限制返回欄位,減少網路流量和客戶端的記憶體使用。

解讀:既可以通過設置{key:1}來顯式指定返回的欄位,也可以設置{key:0}指定需要排除的欄位。

 

(11)  除了首碼樣式查詢,正則表達式查詢不能使用索引,執行的時間比大多數選擇器更長,應節制性地使用它們。

 

(12) 在聚合運算中,$match 要在 $ group前面,通過 $match 前置,可以減少$ group 操作符要處理的文檔數量。

 

(13) 通過操作符對文檔進行修改,通常可以獲得更好的性能,因為,不需要往返伺服器來獲取並修改文檔數據,可以在序列化和傳輸數據上花費更少的時間。

 

(14) 批量插入(batchInsert)可以減少數據向伺服器的提交次數,提高性能。但是批量提交的BSON Size不超過48MB。

 

(15) 禁止一次取出太多的數據進行排序,MongoDB目前支持對32M以內的結果集進行排序。如果需要排序,請儘量限制結果集中的數據量。

 

(16) 查詢中的某些$操作符可能會導致性能低下,如$ne,$not,$exists,$nin,$or,儘量在業務中不要使用。

a)   $exist:因為鬆散的文檔結構導致查詢必須遍歷每一個文檔;

b)   $ne:如果當取反的值為大多數,則會掃描整個索引;

c)   $not:可能會導致查詢優化器不知道應當使用哪個索引,所以會經常退化為全表掃描;

d)   $nin:全表掃描;

e)   $or:有多個條件就會查詢多少次,最後合併結果集,應該考慮裝換為$in。

 

(17) 固定集合可以用於記錄日誌,其插入數據更快,可以實現在插入數據時,淘汰最早的數據。需求分析和設計時,可考慮此特性,即提高了性能,有省去了刪除動作。

     解讀:固定集合需要顯式創建,指定Size的大小,還能夠指定文檔的數量。集合不管先達到哪一個限制,之後插入的新文檔都會把最老的文檔移出。

 

(18) 集合中文檔的數據量會影響查詢性能,為保持適量,需要定期歸檔。

 

本文版權歸作者所有,未經作者同意不得轉載,謝謝配合!!!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天給大家介紹一個在linux下如何捕獲程式崩潰異常的方法 一、google breakpad源碼的下載和編譯 1、https://github.com/google/breakpad.git,源碼地址,git clone XXX克隆即可 2、cd breakpad 3、./configure 4、 ...
  • 在搭建環境時,還遇到了瀏覽器和驅動版本不匹配的一些問題,這裡單獨拿出來做個小結。 Chrome瀏覽器啟動時出現:“您使用的是不受支持的命令行標記:--ignore-certificate-errors.穩定性和安全性會有所下降”的字樣 原因:selenium2啟動Chrome瀏覽器是需要安裝驅動包的 ...
  • <script language="javascript" type="text/javascript"> // 生成目錄索引列表// ref: http://www.cnblogs.com/wangqiguo/p/4355032.html// modified by: zzqfunction Ge ...
  • 這期筆記繼續安裝Gentoo,上期我們已經到了可以進入新環境了,這意味著就是將原來的安裝CD或其它介質改為硬碟上安裝系統了,話不多說,馬上開始! 恢復安裝 由於我已經中斷了安裝,對於已經可以進入新環境的用戶來說,這個可以通過恢復安裝來繼續安裝Gentoo。 首先先掛載根分區: 然後複製DNS信息: ...
  • 網站在運行期間感覺怪怪的,響應速度慢的不是一丁半點,帶寬5M,不該是這樣的呀 於是登錄Xshell 查看cpu情況如下 PID為3435的進程占用CPU過大,難道被病毒入侵了嗎? 查看該進程文件的絕對路徑 發現上述紅框文件,於是上網搜索了下,得治是挖礦病毒 處理辦法 1、刪除tmp目錄里的qW3xT ...
  • 場景:linux下掛載過去的代碼目錄編譯失敗。懷疑本地磁碟空間不足問題導致。解決方法:卸載重新掛載。 操作:卸載時報錯: 解決方法: 1.umount, 老是提示:device is busy, 服務又不能停止的。 可以用"umount -fl"解決! eg:umount -fl 6.0.20 2. ...
  • 一、文件比較運算符 1. e filename 如果 filename存在,則為真 如: [ -e /var/log/syslog ] 2. -d filename 如果 filename為目錄,則為真 如: [ -d /tmp/mydir ] 3. -f filename 如果 filename為 ...
  • 最近在觀察一些大數據方面的職位。特貢獻一套面試題,希望對找工作的博友們一點幫助! 1.簡述Linux以及Linux命令 cd命令 ls命令 mkdir和rmdir命令 cp命令 mv命令 rm命令 cat命令 tac命令 more命令 head命令 tail命令 touch命令 chown命令 fi ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...