当前位置: 首页 > news >正文

【后端面试题】【中间件】【NoSQL】MongoDB查询过程、ESR规则、覆盖索引的优化

任何中间件的面试说到底都是以高可用、高性能和高并发为主,而高性能和高并发基本是同时存在的。
性能优化一直被看作一个高级面试点,因为只有对原理了解得很透彻的人,在实践中才能找准性能优化的关键点,从而通过各种优化手段解决性能问题

MongoDB查询过程

MongoDB在分片之后会有一些机制来保证查询能够准确找到数据。在分库分表中,查询的执行过程中最重要的一步,就是计算数据可能在哪个目标表上。如果实在计算不出来,那么只能考虑使用广播。

MongoDB也需要考虑类似的问题。在MongoDB里,有一类实例叫做mongos,这些实例负责路由查询到目标表上,还有合并结果集
在这里插入图片描述
在分库分表中,计算目标表是分库分表中间件或分库分表代理完成的

MongoDB的ESR规则

在MongoDB里面设计索引的时候就要考虑所谓的ESR规则。
ESR代表的是E(Equality)、S(Sort)和R(Range),也就是相等、排序和范围。在设计索引的时候,按照ESR规则来排列你的索引列。

比如说,你用A进行等值查找,用B进行排序,用C进行范围查询,那么就应该是ABC,如果你是BAC,就违反了ESR规则。

而且ESR的三个元素是可以重复的,只要保证相对顺序不变就可以。

  • EESR:两个等值列
  • ESSR:两个排序列
  • ER:没有排序列
  • ERR:两个范围列

在设计、优化索引的时候就是要让索引尽量符合ESR规则。

面试准备

  • 有没有遇到过MongoDB慢查询的问题?如果有,引发慢查询的原因是什么?最终是怎么解决的?
  • 有没有优化过MongoDB的索引?是怎么优化的?
  • MongoDB的参数有没有调整过?调过哪些?为什么调整?
  • MongoDB的平均查询时间多长?99线以及999线是多少

你可以把 MongoDB 的性能优化、MySQL 查询性能优化、Elasticsearch 性能优化三个合并在一起。也就是说你整个面试思路就是讨论它们三个的性能优化手段。

比如:

  • 在讨论到MySQL索引优化的时候,提起优化MongoDB的索引
  • 在讨论到分库分表分页查询的时候,提起MongoDB里的mongos
  • 在讨论Elasticsearch分片的时候,也可以提起MongoDB的分片

通过这样的横向对比,树立起一个掌握了各种中间件性能优化方法论的形象,从而加深面试官对你的印象,赢得竞争优势。

优化MongoDB查询

覆盖索引

在MySQL上使用覆盖索引的最大好处就是不需要回表,从索引里就可以直接拿到你需要的数据。
在MongoDB里也可以用这样的手段,也就是说,如果有一个索引上有你要查询的全部数据,那么MongoDB就不用把整个文档加载进来。最直观的做法就是在查询中使用projection方法指定字段,而且这些字段都是索引字段。

这算是最基本的优化手段,在真实的工作场景也很常见,因为最开始开发者为了省事,通常是直接把所有的字段查询出来,后续随着数据量增长才会遇到性能问题。

之前我做过一个很简单的优化,早期有一个业务查询,就是把整个文档都加载进来。后面发现,这个查询的调用者大部分其实不需要整个文档,只需要里面的几个字段。所以就额外提供了一个新的查询接口,只会返回部分字段。优化后,大部分查询都是调用新接口,MongoDB也不需要把整个文档加载进来,性能提升了至少30%。

在这里插入图片描述
也可以进一步总结一下

不仅仅是查询,就算是在更新的时候,也要尽可能做到只更新必要的字段。比如在一些业务场景下,出于快速研发的角度,可能考虑前端把整个文档传过来,后端直接更新整个文档。但是如果只传修改过的字段,可以只更新必要的字段,这样的性能也很好。

相关文章:

【后端面试题】【中间件】【NoSQL】MongoDB查询过程、ESR规则、覆盖索引的优化

任何中间件的面试说到底都是以高可用、高性能和高并发为主,而高性能和高并发基本是同时存在的。 性能优化一直被看作一个高级面试点,因为只有对原理了解得很透彻的人,在实践中才能找准性能优化的关键点,从而通过各种优化手段解决性…...

使用c++函数式编程实现Qt信号槽机制

问题背景 在下面的代码中&#xff0c;Input输入器 输入数据&#xff0c;希望A和B 接收数据。但使用的赋值&#xff0c;导致in.a和a只是拷贝数据&#xff0c;而不是同一个对象&#xff0c;使得数据不同步。 #include <iostream> struct A {int age 32; }; struct B {int …...

【Android】Activity子类之间的区别

从底层往顶层的继承顺序依次是&#xff1a; Activity&#xff0c;最原始的Activity androidx.core.app.ComponentActivity&#xff0c;仅仅优化了一个关于KeyEvent的拦截问题&#xff0c;一般不继承这个类 androidx.activity.ComponentActivity&#xff0c;支持和Android Arc…...

在 Mac 上使用 MLX 微调微软 phi3 模型

微调大语言模型是常见的需求&#xff0c;由于模型参数量大&#xff0c;即使用 Lora/Qlora 进行微调也需要 GPU 显卡&#xff0c;Mac M系是苹果自己的 GPU&#xff0c;目前主流的框架还在建立在 CUDA 的显卡架构&#xff0c;也就是主要的卡还是来自英伟达。如果要用 Mac 来做训练…...

【JavaEE】多线程代码案例(2)

&#x1f38f;&#x1f38f;&#x1f38f;个人主页&#x1f38f;&#x1f38f;&#x1f38f; &#x1f38f;&#x1f38f;&#x1f38f;JavaEE专栏&#x1f38f;&#x1f38f;&#x1f38f; &#x1f38f;&#x1f38f;&#x1f38f;上一篇文章&#xff1a;多线程代码案例(1)&a…...

Halcon支持向量机

一 支持向量机 1 支持向量机介绍&#xff1a; 支持向量机(Support Vector Machine&#xff0c;SVM)是Corinna Cortes和Vapnik于1995年首先提出的&#xff0c;它在解决小样本、非线性及高维模式识别表现出许多特有的优势。 2 支持向量机原理: 在n维空间中找到一个分类超平面…...

【Python机器学习】模型评估与改进——在模型选择中使用评估指标

我们通常希望&#xff0c;在使用GridSearchCV或cross_val_score进行模型选择时能够使用AUC等指标。scikit-learn提供了一种非常简单的实现方法&#xff0c;那就是scoring参数&#xff0c;它可以同时用于GridSearchCV和cross_val_score。你只需要提供一个字符串&#xff0c;用于…...

【C语言】union 关键字

在C语言中&#xff0c;union关键字用于定义联合体。联合体是一种特殊的数据结构&#xff0c;它允许不同的数据类型共享同一段内存。所有联合体成员共享同一个内存位置&#xff0c;因此联合体的大小取决于其最大成员的大小。 定义和使用联合体 基本定义 定义一个联合体类型时…...

电脑回收站删除的文件怎么恢复?5个恢复方法详解汇总!

电脑回收站删除的文件怎么恢复&#xff1f;在我们日常使用电脑的过程中&#xff0c;难免会遇到误删文件的情况。一旦发现自己误删文件了&#xff0c;先不要着急&#xff0c;还是有很多方法可以找回的。市面上还是有很多好用的文件恢复软件可以使用&#xff0c;具体介绍如下。 本…...

mac 安装cnpm 淘宝镜像记录

mac 安装cnpm 淘宝镜像记录 本文介绍了在安装cnpm时遇到权限问题的解决方案&#xff0c;包括使用sudo&#xff0c;处理SSL证书过期&#xff0c;以及因版本不一致导致的错误处理方法&#xff0c;步骤包括设置npm配置、卸载和重新安装cnpm到特定版本。 安装 npm install cnpm …...

ArcGIS Pro SDK (七)编辑 11 撤销重做

ArcGIS Pro SDK &#xff08;七&#xff09;编辑 11 撤销&重做 文章目录 ArcGIS Pro SDK &#xff08;七&#xff09;编辑 11 撤销&重做1 撤消/重做最近的操作 环境&#xff1a;Visual Studio 2022 .NET6 ArcGIS Pro SDK 3.0 1 撤消/重做最近的操作 //撤销 if (MapV…...

Excel 中的元素定位:相对定位、绝对定位和混合定位

在Excel中&#xff0c;单元格引用有三种主要类型&#xff1a;相对定位、绝对定位和混合定位。 这些类型主要用于公式和函数中&#xff0c;决定在复制或拖动公式时引用如何变化。 1. 相对定位 相对定位指的是不带“$”符号的单元格引用&#xff0c;例如 A1。 这种引用方式在…...

Idea2024安装后点击无响应

问题 最近因工作需要&#xff0c;升级一下 idea 版本&#xff0c;之前一直使用的是2020版本&#xff0c;下载最新的2024版本&#xff08;下载的 zip 包免安装模式&#xff0c;之前使用的2020版本也是免安装的&#xff0c;因为是免安装的&#xff0c;所以之前的版本也没有删除&…...

如何提高实验室分析结果的准确性呢

要提高实验室分析结果的准确性&#xff0c;可以从以下几个方面着手&#xff1a; 1、选择合适的实验方法 不同的实验方法具有不同的优缺点&#xff0c;实验方法的准确度直接影响测定结果的准确度。因此&#xff0c;在选择实验方法时&#xff0c;需要根据实验目的、实验原理、实…...

Perl 格式化输出:提升代码可读性的技巧

引言 Perl 是一种功能强大的脚本语言&#xff0c;广泛用于文本处理、系统管理、网络编程等多个领域。在 Perl 编程中&#xff0c;代码的格式化输出不仅有助于提升代码的可读性&#xff0c;还能增强程序的用户体验。本文将详细介绍如何在 Perl 中实现代码的格式化输出。 Perl …...

JavaScript基础-函数(完整版)

文章目录 函数基本使用函数提升函数参数arguments对象&#xff08;了解&#xff09;剩余参数(重点)展开运算符(...) 逻辑中断函数参数-默认参数函数返回值-return作用域(scope)全局作用域局部作用域变量的访问原则垃圾回收机制闭包 匿名函数函数表达式立即执行函数 箭头函数箭头…...

AI开发者的新选择:Mojo编程语言

随着人工智能技术的迅猛发展&#xff0c;编程语言的选择在AI项目的成功中扮演着至关重要的角色。近年来&#xff0c;Mojo编程语言作为一种专为AI开发者设计的新兴语言&#xff0c;逐渐引起了广泛关注。本文将详细介绍Mojo编程语言的特点、优势及其在AI开发中的应用。 目录 Mo…...

软考(高项)系统分析师--论软件开发模型及应用

文章目录 前言一、前期准备&#xff1a;二、论文部分: 前言 本文对系统分析师&#xff0c;软件开发模型及其应用文章进行展示&#xff0c;可以拷贝后直接粘贴到word 文档中。 一、前期准备&#xff1a; 项目主体功能项目背景常用的软件开发模型&#xff1a;瀑布模型&#xff…...

同一天提档又撤档!电影《野孩子》宣布取消7月10日公映安排——浔川电影报

同一天提档又撤档&#xff01; 7月3日晚上10点&#xff0c;电影野孩子 发声明官宣撤档&#xff0c;“由于后期进度原因&#xff0c;电影《野孩子》将取消7月10日的公映安排&#xff0c;我们向各影管院线的同仁及所有观众朋友们致以最诚挚的歉意&#xff0c;谢谢大家这段时间的…...

Shell编程之免交互

一、Here Document免交互 1&#xff1a;概述 Here Document 是一个特殊用途的代码块&#xff0c;它在 Linux Shell 中使用 I/O 重定向的方式将命令列表提供给交互式程序或命令&#xff0c;比如 ftp、cat 或 read 命令&#xff0c;Here Document 是标准输入的一种替代品 语法…...

LangChain 与 LangGraph 介绍

一&#xff64;AI 时代下的编程范式 1. Vibe Coding 氛围编程 1.1 Vibe Coding 的起源 在过去十年间&#xff0c;低代码 / 无代码平台和 AI 代码助手持续冲击着软件开发行业。如今&#xff0c;一种被称为 Vibe Coding 的新兴实践突然走红&#xff0c;甚至颠覆了人们对 "…...

CanFestival主站PDO配置避坑指南:以Kinco FD伺服的速度/位置模式控制为例

CanFestival主站PDO配置实战&#xff1a;从零解析Kinco FD伺服双模式控制 当你在深夜的实验室里盯着屏幕上闪烁的CAN报文&#xff0c;却发现伺服电机对控制指令毫无反应时&#xff0c;那种挫败感每个工控开发者都深有体会。本文将带你穿透CanFestival主站配置的迷雾&#xff0c…...

通过信道优化数据传输的通信链路的实现附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…...

机械键盘连击终极解决方案:Keyboard Chatter Blocker全方位技术解析

机械键盘连击终极解决方案&#xff1a;Keyboard Chatter Blocker全方位技术解析 【免费下载链接】KeyboardChatterBlocker A handy quick tool for blocking mechanical keyboard chatter. 项目地址: https://gitcode.com/gh_mirrors/ke/KeyboardChatterBlocker Keyboar…...

拯救数字青春:GetQzonehistory让QQ空间记忆永久安家

拯救数字青春&#xff1a;GetQzonehistory让QQ空间记忆永久安家 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在这个信息爆炸的时代&#xff0c;我们的青春记忆正以数据形式储存在各大…...

强化学习实战:用Python手把手实现值迭代与策略迭代算法(附完整代码)

强化学习实战&#xff1a;用Python手把手实现值迭代与策略迭代算法&#xff08;附完整代码&#xff09; 强化学习作为机器学习的重要分支&#xff0c;近年来在游戏AI、自动驾驶、机器人控制等领域展现出惊人潜力。对于初学者而言&#xff0c;理解算法原理固然重要&#xff0c;但…...

2025年深度评测:掌握Liebling主题,解锁Ghost博客的现代设计潜力

2025年深度评测&#xff1a;掌握Liebling主题&#xff0c;解锁Ghost博客的现代设计潜力 【免费下载链接】liebling Beautiful and clean Ghost theme that is easy and comfortable to use. To get the latest version please head over the releases page &#x1f449;&#…...

Flask-base实战案例:从零构建功能完备的博客系统

Flask-base实战案例&#xff1a;从零构建功能完备的博客系统 【免费下载链接】flask-base A simple Flask boilerplate app with SQLAlchemy, Redis, User Authentication, and more. 项目地址: https://gitcode.com/gh_mirrors/fl/flask-base Flask-base是一个功能强大…...

如何通过技术优化提升Element Plus开发效率

如何通过技术优化提升Element Plus开发效率 【免费下载链接】element-plus &#x1f389; A Vue.js 3 UI Library made by Element team 项目地址: https://gitcode.com/GitHub_Trending/el/element-plus 在前端开发过程中&#xff0c;Element Plus作为一款基于Vue.js 3…...

用Asian Beauty Z-Image Turbo做古风头像:简单三步生成独一无二的东方美学作品

用Asian Beauty Z-Image Turbo做古风头像&#xff1a;简单三步生成独一无二的东方美学作品 想象一下&#xff0c;你的社交媒体头像不再是一张普通的自拍或卡通形象&#xff0c;而是一幅充满东方韵味的古风艺术作品——可能是唐代仕女的温婉&#xff0c;宋代文人的儒雅&#xf…...