【后端面試題】【中間件】【NoSQL】MongoDB查詢優化3(拆分、嵌入文檔,操作系統)

拆分大文檔

很常見的一種優化手段,在一些特定的業務場景中,會有一些很大的文檔,這些文檔有很多字段,而且有一些特定的字段還特別的大。可以考慮拆分這些文檔

大文檔對MongoDB的性能影響還是很大的,就我個人經驗而言,認為可以考慮從兩個角度出發拆分大文檔:

  1. 按照字段的訪問頻率拆分: 訪問頻繁的放一個文檔,訪問不頻繁的拆出去作為另一個文檔
  2. 按照字段的大小來劃分: 小字段放一個文檔,大字段拆除去作為另外一個文檔

之前拆分過一個文檔,非常龐大。而且在業務中,有一些龐大的字段根本用不上,在這種情況下,一次拆除了三個文檔。

  • 訪問頻繁的小字段放在一起,作為一個文檔
  • 訪問不頻繁的大字段拆出去作為一個文檔。可以進一步優化為特定的巨大的字段可以直接作為一個文檔
  • 剩余的合并在一起作為一個文檔

這樣做的優點很明顯,比較多的業務查詢其實只需要第一種文檔,極少數會需要第二種文檔;但是缺點也很明顯,如果調用者需要整個文檔,也就意味著需要查詢三次,再合并組成一個業務上完整的文檔。

也可以升華一下:這種拆分終究是下策,最好還是在一開始使用MongoDB的時候就約束住文檔的大小。
不過還有一個和這種策略完全相反的優化手段:嵌入文檔

嵌入文檔

如果A文檔和B文檔有關聯關系,那么就在A文檔里面嵌入B文檔,做成一個大文檔。
相當于原本A文檔和B文檔都是單獨存儲的,可能A文檔里面有一個B文檔的ID字段,又或者B文檔里有A文檔的ID字段,可以考慮合并這兩個文檔

在這里插入圖片描述
可以這么介紹你的方案:

早期有一個過度設計的場景,就是有兩個文檔A和B,其中A里面有一個B的文檔ID,建立了一對一的映射關系。但是實際上,業務查詢的時候,基本上是分兩次查詢的,先把A查詢出來,再根據A里面的文檔ID也把B查出來
后來這個地方慢慢成為了性能瓶頸,我就嘗試優化了這個地方。我的想法是既然A和B在業務上聯系那么緊密,我可以直接把他們整合成一個文檔。整合之后,一次查詢就能拿到所有需要的數據了,直接節約了一個MongoDB查詢,提高了業務的響應時間,而且MongoDB的壓力也變小了。

如果面試官問怎么直接整合成一個文檔呢?

采用的是懶惰的、漸進式的整合方案。如果我先查詢A文檔之后發現A文檔還沒有嵌入B文檔,那么就查詢B文檔,嵌入進A文檔之后,直接更新A文檔。在更新A文檔的時候,要采用樂觀鎖策略,也就是在更新的條件里,加上A文檔不包含B文檔這個條件。

這個業務有一個好處是,沒有直接更新B文檔的場景,都是通過A來操作B文檔,所以不需要考慮其他的并發問題

在這里插入圖片描述
這種懶惰更新策略里的最后一步更新動作,實際上就是一個樂觀鎖。所以也可以嘗試把話題引導到樂觀鎖上

不過,嵌入整個文檔是很罕見的優化手段。更加常見的是嵌入部分字段,也叫做冗余字段。這種優化手段在關系型數據庫里也很常見,比如A經常使用B的某幾個字段,那么就可以在A里面冗余一份。但是這種冗余的方案會有比較嚴重的數據一致性問題,只有在你能夠容忍這種數據不一致的時候,才可以應用這個方案。
在現實中最常見的場景就是在別的模塊的文檔里冗余用戶的昵稱、頭像,這樣可以避免再次去用戶文檔里查詢昵稱或頭像。畢竟這兩個在很多時候都不是什么關鍵字段。

操作系統優化

前面基本都是查詢本身的優化,也可以準備一些操作系統優化的點。

內存優化

在MongoDB里,索引對性能的影響很大,所以應該盡可能保證有足夠的物理內存來放所有的索引。

swap

同樣需要避免觸發交換,可以調小vm.swappiness 這個參數

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42221.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42221.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42221.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ASCII碼對照表【2024年匯總】

🍺ASCII相關文章匯總如下🍺: 🎈ASCII碼對照表(255個ascii字符匯總)🎈🎈ASCII碼對照表(Unicode 字符集列表)🎈🎈ASCII碼對照表&#x…

Day05-04-持續集成總結

Day05-04-持續集成總結 1. 持續集成2. 代碼上線目標項目 1. 持續集成 git 基本使用, 拉取代碼,上傳代碼,分支操作,tag標簽 gitlab 用戶 用戶組 項目 , 備份,https,優化. jenkins 工具平臺,運維核心, 自由風格工程,maven風格項目,流水線項目, 流水線(pipeline) mavenpom.xmlta…

【瑞數補環境實戰】某網站Cookie補環境與后綴分析還原

文章目錄 1. 寫在前面2. 特征分析3. 接口分析3. 補JS環境4. 補后綴參數 【🏠作者主頁】:吳秋霖 【💼作者介紹】:擅長爬蟲與JS加密逆向分析!Python領域優質創作者、CSDN博客專家、阿里云博客專家、華為云享專家。一路走…

二分查找2

1. 山脈數組的峰頂索引&#xff08;852&#xff09; 題目描述&#xff1a; 算法原理&#xff1a; 根據題意我們可以將數組分為兩個部分&#xff0c;一個部分是arr[mid-1]<arr[mid]&#xff0c;另一個部分為arr[mid-1]>arr[mid]&#xff0c;此時不難發現我們可以將二分…

Flink,spark對比

三&#xff1a;az 如何調度Spark、Flink&#xff0c;MR 任務 首先&#xff0c;使用java編寫一個spark任務&#xff0c;定義一個類&#xff0c;它有main方法&#xff0c;里面寫好邏輯&#xff0c;sparkConf 和JavaSparkContext 獲取上下文&#xff0c;然后打成一個jar包&#xf…

數據結構——二叉樹相關題目

1.尋找二叉樹中數值為x的節點 //尋找二叉樹中數值為x的節點 BTNode* TreeFind(BTNode* root, BTDataType x)//傳過來二叉樹的地址和根的地址&#xff0c;以及需要查找的數據 {if (root Null){return Null;}//首先需要先判斷這個樹是否為空&#xff0c;如果為空直接返回空if (…

【JavaWeb程序設計】JSP實現購物車功能

目錄 一、結合之前所學的相關技術&#xff0c;編寫代碼實現以下購物車功能 1. 我實現的功能運行截圖如下 &#xff08;1&#xff09;商品列表頁面home.jsp &#xff08;2&#xff09;登錄賬號頁面/未登錄點擊結賬頁面 &#xff08;3&#xff09;重新登錄頁面&#xff08;記…

昇思25天學習打卡營第18天|ShuffleNet圖像分類

一、簡介&#xff1a; ShuffleNetV1是曠視科技提出的一種計算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一樣主要應用在移動端&#xff0c;所以模型的設計目標就是利用有限的計算資源來達到最好的模型精度。ShuffleNetV1的設計核心是引入了兩種操作&#xff1a;Poin…

如何在centos7安裝Docker

在centOS7中我們可以使用火山引擎鏡像源鏡像安裝Docker,以下是具體的安裝步驟。 step 1: 安裝必要的一些系統工具 sudo yum install -y yum-utils Step 2: 添加軟件源信息 sudo yum-config-manager --add-repo https://mirrors.ivolces.com/docker/linux/centos/docker-ce.r…

力扣雙指針算法題目:二叉樹的層序遍歷(BFS)

目錄 1.題目 2.思路解析 3.代碼 1.題目 . - 力扣&#xff08;LeetCode&#xff09; 2.思路解析 對二叉樹進行層序遍歷&#xff0c;顧名思義&#xff0c;就是按每一層的順序對二叉樹一層一層地進行遍歷 思路如下 從第一層開始&#xff0c;先將二叉樹地頭放入隊列q&#xff0…

獨孤思維:副業被罵煞筆,割韭菜

做副業不要被外界干擾&#xff0c;不要被情緒牽絆。 不要因為別人的無心謾罵&#xff0c;隨口一評&#xff0c;就偃旗息鼓。 不要因為自己的情緒需要&#xff0c;找存在感&#xff0c;尋求人安慰。 他強任他強&#xff0c;清風拂山崗。 他橫由他橫&#xff0c;明月照大江。…

2007-2022年中國各企業數字化轉型與供應鏈效率

企業數字化轉型與供應鏈效率是現代企業管理和發展的兩個關鍵方面。以下是對中國各企業數字化轉型與供應鏈效率數據的介紹&#xff1a; 數據簡介 企業數字化轉型&#xff1a;指企業通過采用數字技術與創新方法&#xff0c;改造業務流程、組織結構和產品服務&#xff0c;以提升…

UCOS-III 系統移植

1. 移植前準備 1.1 源碼下載 UCOS-III Kernel Source&#xff1a; https://github.com/weston-embedded/uC-OS3.git Micriμm CPU Source &#xff1a; https://github.com/weston-embedded/uC-CPU.git Micriμm Lib Source&#xff1a; https://github.com/weston-embedded…

Nginx配置文件全解:從入門到設計

Nginx配置文件全解&#xff1a;從入門到架構設計 1. Nginx配置文件基礎 Nginx的主配置文件通常位于/etc/nginx/nginx.conf?。配置文件使用簡單的文本格式&#xff0c;由指令和指令塊組成。 1.1 基本語法規則 每個指令以分號(;)結束指令塊用大括號({})包圍配置文件支持使用…

多方SQL計算場景下,如何達成雙方共識,確認多方計算作業的安全性

安全多方計算在SQL場景下的限制 隨著MPC、隱私計算等概念的流行&#xff0c; 諸多政府機構、金融企業開始考慮參與到多方計算的場景中&#xff0c; 擴展數據的應用價值。 以下面這個場景為例&#xff0c; 銀行可能希望獲取水電局和稅務局的數據&#xff0c;來綜合計算得到各…

DolphinScheduler-3.1.9 資源中心實踐

前言 目前DolphinScheduler最新的穩定版本是 3.1.9 &#xff0c;基于此做些探索&#xff0c;逐漸深化學習路徑&#xff0c;以便于加深理解。 3.2.1 是最新的版本。目前的穩定版本是 3.1.9 基礎環境&#xff1a;Hadoop3.3, Java 8, Python3, MacOS14.2.1 一、本地偽分布式安裝…

學習筆記——動態路由——IS-IS中間系統到中間系統(開銷)

四、IS-IS開銷 1、IS-IS 開銷簡介 在IS-IS協議剛面世時&#xff0c;互聯網網絡結構還非常簡單&#xff0c;因此IS-IS早期的版本中只使用了6bit來描述鏈路開銷&#xff0c;鏈路開銷的取值范圍是1-63。一條路由的開銷范圍只有10bit&#xff0c;取值范圍是0-1023。 隨著計…

前端實現無縫自動滾動動畫

1. 前言: 前端使用HTMLCSS實現一個無縫滾動的列表效果 示例圖: 2. 源碼 html部分源碼: <!--* Author: wangZhiyu <w3209605851163.com>* Date: 2024-07-05 23:33:20* LastEditTime: 2024-07-05 23:49:09* LastEditors: wangZhiyu <w3209605851163.com>* File…

【ubuntu】安裝(升級)顯卡驅動,黑屏|雙屏無法使用問題解決方法

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 ubuntu 安裝(升級)顯卡驅動&#xff0c;黑屏|雙屏無法使用問題解決方法 由于項目需要&#xff0c;對顯卡驅動進行升級。升級完就黑屏。。。。&#xff0…

Fast R-CNN(論文閱讀)

論文名&#xff1a;Fast R-CNN 論文作者&#xff1a;Ross Girshick 期刊/會議名&#xff1a;ICCV 2015 發表時間&#xff1a;2015-9 ?論文地址&#xff1a;https://arxiv.org/pdf/1504.08083 源碼&#xff1a;https://github.com/rbgirshick/fast-rcnn 摘要 這篇論文提出了一…