秋招Java后端开发冲刺——非关系型数据库篇(MongoDB)

MongoDB

本文介绍非关系型数据库MongoDB的基础知识和常见面试题。
在这里插入图片描述

(一)基础知识

1. 介绍:MongoDB是一个基于分布式文件存储的数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。
2.特点

特点说明
文档存储使用 BSON(二进制 JSON)格式存储文档,支持嵌套结构和数组。
灵活的模式(Schema-less)支持动态模式设计,文档结构可以不固定,适合快速迭代开发。
高性能通过内存映射文件和高效的索引机制,提供高性能读写操作。
高可用性支持复制集(Replica Set),提供自动故障转移和数据冗余。
横向扩展支持分片(Sharding)功能,通过分布式架构实现数据的水平扩展。
强一致性默认提供强一致性保证,通过复制集配置可以调整一致性级别。
丰富的查询语言提供丰富的查询语言,支持字段、范围、正则表达式查询以及聚合框架。
原子操作支持单文档级别的原子操作,确保数据修改的一致性和完整性。
支持事务4.0 版本开始支持多文档 ACID 事务,增强数据操作的可靠性。
跨平台支持多种操作系统,包括 Windows、Linux 和 macOS。
易于集成提供多种官方驱动程序,支持多种编程语言,如 JavaScript、Python、Java、C# 等。
强大的社区支持拥有活跃的社区和丰富的文档资料,便于开发者学习和使用。
灵活的索引支持多种类型的索引,如单字段索引、复合索引、地理空间索引和全文索引。
聚合框架提供强大的聚合框架,支持数据处理和分析操作,如过滤、排序、分组、投影等。
文件存储通过 GridFS 实现大文件存储,适用于存储图片、视频等大文件数据。
安全性提供认证和授权机制,支持基于角色的访问控制(RBAC),确保数据安全。
备份与恢复提供多种备份与恢复机制,包括快照备份、导入导出工具和云备份服务。
可视化工具提供官方的 MongoDB Compass 可视化工具,便于管理和分析数据库。

3. 存储结构
(1)文档
文档是 MongoDB 的基本数据单位,使用 BSON 格式存储。每个文档包含键值对,类似于 JSON 对象.
:BSON文档是JSON 文档的二进制表示
(2)集合
集合是一组文档的容器,相当于关系型数据库中的表。集合中的文档可以具有不同的结构。
(3)数据库
数据库是集合的命名空间,相当于关系型数据库中的数据库,每个数据库包含集合、索引和一些元数据。

4. 存储引擎
MangoDB的默认存储引擎是 WiredTiger,支持文档级别的并发控制和压缩。除此之外,MangoDB还支持 MMAPv1(旧版本)和其他第三方存储引擎。
(1)WiredTiger存储引擎
① WiredTiger是MongoDB 3.2 版本开始默认的存储引擎,提供了更高的并发性、压缩和高效的内存使用。
② 特点

  • 文档级锁定:WiredTiger 使用文档级锁定,提高了并发写操作的性能
  • 数据压缩:支持数据和索引压缩,减少磁盘空间的使用
  • 缓存管理:WiredTiger 使用自适应缓存管理,优化内存使用
  • 事务支持:提供多文档 ACID 事务支持,保证数据一致性(与InnoDB事务不相同)
    ③ 配置
storage:dbPath: /var/lib/mongodbengine: wiredTigerwiredTiger:engineConfig:cacheSizeGB: 1statisticsLogDelaySecs: 0journalCompressor: snappycollectionConfig:blockCompressor: snappyindexConfig:prefixCompression: true

(2)MMAPv1 存储引擎
① MMAPv1 是 MongoDB 的原始存储引擎,在 MongoDB 3.0 之前是默认存储引擎,它使用内存映射文件来存储数据。
② 特点

  • 集合级锁定:MMAPv1 使用集合级锁定,适用于读操作较多的场景。
  • 简单实现:设计简单,适合需要快速读取的大量数据
    ③ 配置
storage:dbPath: /var/lib/mongodbengine: mmapv1mmapv1:nsSize: 16smallFiles: truejournal:enabled: true

(3)In-Memory 存储引擎((在 MongoDB Enterprise 中可用))
① In-Memory 存储引擎将所有数据存储在内存中,适用于需要极高性能和低延迟的场景。
② 特点

  • 高性能:由于数据全部存储在内存中,读写操作速度极快。
  • 无持久化:数据仅在内存中存储,服务器重启后数据会丢失。
    ③ 配置
storage:dbPath: /var/lib/mongodbengine: inMemoryinMemory:engineConfig:inMemorySizeGB: 2

5. 索引

  • 单字段索引
  • 复合索引:遵循最左前缀原则
  • 多键索引:MongoDB 的一个字段可能是数组,在对这种字段创建索引时,就是多键索引;多键索引为数组中每一个值创建索引
  • 哈希索引:按数据的哈希值索引,用在哈希分片集群上
  • 文本索引: 支持对字符串内容的文本搜索查询,一个集合一个
  • TTL索引:参考MongoDB索引
  • 地理位置索引
(二)常见面试题

1. MongoDB 集群
(1)复制集群

  • 是一组维护相同数据集合的 mongodb 进程
  • 组成:包含 1 个主节点(Primary),多个从节点(Secondary)以及零个或 1 个仲裁节点(Arbiter)
  • 主节点负责写和读,从节点负责读,仲裁节点不存储数据,只负责选举时投票
  • 主节点与备节点之间是通过 oplog(操作日志) 来同步数据的( local 库下的一个特殊的 上限集合(Capped Collection) ,用来保存写操作所产生的增量日志)

(2)分片集群

  • 数据被均衡的分布在不同分片中
  • 组成
    ① Config Servers:配置服务器,本质上是一个 MongoDB 的副本集,负责存储集群的各种元数据和配置,如分片地址、Chunks 等
    ② Mongos:路由服务,不存具体数据,从 Config 获取集群配置讲请求转发到特定的分片,并且整合分片结果返回给客户端
    ③ Shard:每个分片是整体数据的一部分子集
  • 分片算法
    ① 基于范围的分片:适合分片键的值不是单调递增或单调递减、分片键的值基数大且重复的频率低、需要范围查询等业务场景。
    ② 基于 Hash 值的分片:适合分片键的值存在单调递增或递减、片键的值基数大且重复的频率低、需要写入的数据随机分发、数据读取随机性较大等业务场景。

2. MongoDB聚合
(1)介绍
① MongoDB 的聚合框架是一个强大的工具,用于处理数据并生成汇总结果。它允许在文档集合上执行复杂的数据处理和分析操作。
聚合管道:是一系列数据处理阶段的组合,每个阶段会对输入文档进行操作,并将结果传递给下一个阶段。

(2)聚合管道常用阶段操作符

  • $match:过滤文档,类似于查询的 find 操作
  • $group:将文档分组,并可对每个分组进行计算
  • $sort:对文档排序
  • $project:重新定义文档的结构,可以添加、删除字段
  • $limit:限制返回的文档数量
  • $skip:跳过指定数量的文档
  • $unwind:将数组类型字段拆分为多个文档

(3)聚合框架的性能优化

  • 使用索引:在 $match 阶段尽量使用索引,以提高过滤数据的速度
  • 限制返回数据量:使用 $limit 和 $skip 控制返回的数据量,避免一次性处理大量数据
  • 简化管道阶段:尽量减少管道阶段的数量,每个阶段只处理必要的数据
  • 适当使用 $project:在数据进入聚合管道时尽早使用 $project 只保留需要的字段,以减少数据传递的开销

3. MongoDB的数据备份和恢复
(1)备份

  • mongodump 命令将 MongoDB 数据导出为 BSON 格式的文件
  • 可以备份整个数据库或指定的集合
  • 示例
mongodump --db <database_name> --out <backup_directory>

(2)恢复

  • mongorestore 命令将 BSON 文件导入到 MongoDB 中,用于恢复数据
  • 示例
mongorestore --db <database_name> <backup_directory>

(3)文件级备份

  • 通过复制 MongoDB 数据存储文件来实现,适用于使用 WiredTiger 存储引擎的 MongoDB 数据库
  • 步骤
    ① 锁定数据库:使用 fsync 锁定数据库以确保数据一致性
    ② 复制数据文件:复制 MongoDB 数据存储文件
    ③ 解锁数据库:解锁数据库

4. MongoDB事务

  • MongoDB 在 4.0 版本开始支持多文档 ACID 事务,使其在操作多个文档和集合时能够保证数据的一致性。
  • 复制集环境:MongoDB 的多文档事务需要在复制集环境中才能使用。
  • 跨分片事务:MongoDB 4.2 及以上版本支持跨分片事务,但需要配置分片集群。

5. 如何处理 MongoDB 中的慢查询
(1)慢查询日志

  • MongoDB 具有内置的慢查询日志功能,可以记录超过指定时间的查询。配置方法如下:
# mongod.conf
operationProfiling:slowOpThresholdMs: 100 # 设置慢查询阈值为 100 毫秒mode: slowOp
  • db.currentOp() :可以查看当前正在执行的操作,包括运行时间长的查询
  • db.system.profile:数据库的性能分析器,捕获详细的操作信息

(2)慢查询分析
使用 explain() 分析查询计划,帮助分析查询是如何执行的,包括使用的索引、扫描的文档数等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/35384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中double与String转换并相加,相减等运算

将double与String进行相互转换&#xff0c;并执行相加、相减等操作&#xff0c;并可以保留一定的小数位数。 1. double 与 String 之间的转换 double 转 String 使用 Double.toString(double d) 方法&#xff1a; double num 123.456; String str Double.toString(num); …

凯迪正大对高压电缆泄漏与耐压试验方法及步骤分享

为确保高压电缆的性能和安全进行泄漏和耐压试验是必不可少的环节&#xff0c;本文还是依照凯迪正大的从业经验介绍高压电缆泄漏和耐压试验的方法及步骤。希望能对大家起到积极的作用&#xff0c;也欢迎大家留言交流讨论与指正。 一、试验目的 高压电缆泄漏和耐压试验的主要目的…

关于今天对于四象限法则的运用(6月26日)

每日三问&#xff1f;你为什么活着&#xff1f;你为什么准备专升本&#xff1f;你为什么打算考研&#xff1f; 因为广阔的生命等待着我自己的体验和探索&#xff0c;不能以目标为导向&#xff0c;要以目标的实践活动为导向&#xff0c;这样自己的生命才会有意义才能进行一个不断…

怎样实现聊天弹幕效果?

可以使用HTML、CSS和JavaScript的组合。以下是一个简单的步骤和示例代码&#xff0c;说明如何创建一个基本的弹幕效果&#xff1a; HTML结构&#xff1a; 创建一个用于显示弹幕的容器和输入弹幕的表单。 <!DOCTYPE html> <html lang"en"> <hea…

SDN的实际应用

SDN&#xff08;Software-Defined Networking&#xff0c;软件定义网络&#xff09;是一种网络架构&#xff0c;它通过将网络控制层与数据转发层分离&#xff0c;实现网络的集中控制和灵活管理。SDN的核心思想是通过软件来定义网络行为&#xff0c;从而使得网络更加灵活、可编程…

转运机器人:智能物流的得力助手

在物流行业&#xff0c;转运机器人已经成为提高转运效率、降低成本的重要工具。而富唯智能转运机器人凭借其出色的性能和智能化的设计&#xff0c;成为了众多企业的得力助手。 富唯智能转运机器人采用了先进的AMR控制系统&#xff0c;可以一体化控制移动机器人并实现与产线设备…

【AIGC】关于我用AI这玩意儿搞到人生第一笔副业这件事

前言 起初只是对AI感兴趣 后来没想到这玩意儿还能让我接兼职 我已经嗅到了AI的商机 接下来就是挖掘更钝金主爸爸 低收入一定要学&#xff01;&#xff01;&#xff01;&#xff01; 新手可以先从Midiourney入手 PS&#xff1a;如果不知道怎么学&#xff0c;可以扫描下方二…

渗透测试之SQL注入

渗透测试之SQL注入 1. SQL注入分类 按照攻击类型分为&#xff1a;联合查询注入、布尔注入、时间延迟注入、报错型注入、堆叠型注入等 按照注入位置分为&#xff1a;HTTP头注入、请求参数注入等 按照数据库场景分为&#xff1a;MySQL注入、MSSQL注入、Oracle场景注入 1. My…

注意!!2024下《系统分析师》易混淆知识点来了,赶紧收藏

宝子们&#xff0c;在复习软考系统分析师中&#xff0c;是不是觉得有很多知识点含义比较相近&#xff0c;很多友友刚看的时候估计会像我一样迷迷糊糊的&#xff0c;作为一个软考老鸟&#xff0c;在这里给大家整理了系分学习过程中易混淆的知识点&#xff0c;大家认真复习就行&a…

网络安全入门教程(非常详细)从零基础入门到精通,看完这一篇你就是网络安全高手了。

关于我 我算是“入行”不久的一个新人安全工作者&#xff0c;为什么是引号呢&#xff0c;因为我是个“半个野路子”出身。早在13年的时候&#xff0c;我在初中时期就已经在90sec、wooyun等社区一直学习、报告漏洞。后来由于升学的压力&#xff0c;我逐渐淡出了安全圈子&#x…

基于ssm实现的车辆管理系统(文末源码+Lw)272

摘要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。以前企业对于车辆信息的管理和控制&#xff0c;采用人工登记的方式保存相关数据&#xff0c;这种以人力为主的管理模式已然落后。本人结…

windows系统根据端口查询pid并结束进程 netstat taskkill

用管理员权限打开命令指示符,输入命令&#xff1a; 1、查看被占用端口所对应的 PID netstat -aon|findstr “端口号” 2、查看指定PID的进程 tasklist|findstr ”14816” 3、结束进程 taskkill -pid 进程号 -f

Leetcdoe-Day19-代码随想录-栈与队列-1047-150

1047. 删除字符串中的所有相邻重复项 题目链接 题解&#xff1a;简单题&#xff0c;最后需要注意反转字符串即可。 class Solution { public:string removeDuplicates(string s) {stack<char> z;for(int i0;i<s.size();i){if(!z.empty()){int topz.top();if(tops[i]…

使用GRANT语句来设置用户表的权限

SQL Server中&#xff0c;可以使用GRANT语句来设置用户表的权限。 首先&#xff0c;你需要有足够的权限来执行这个操作&#xff0c;比如sysadmin或db_owner角色成员。 下面是一些常见的GRANT语句示例&#xff1a; 授予SELECT权限给用户&#xff1a; GRANT SELECT ON 表名 TO …

离线安装Docker社区版:全面指南

感谢您阅读本文&#xff0c;欢迎“一键三连”。作者定会不负众望&#xff0c;按时按量创作出更优质的内容。 ❤️ 1. 毕业设计专栏&#xff0c;毕业季咱们不慌&#xff0c;上千款毕业设计等你来选。 在现代软件开发中&#xff0c;Docker已经成为了不可或缺的工具。它简化了应用…

天津化工厂爆炸事件时刻提醒着我们要重视企业的安全生产问题

近日&#xff0c;天津某化工厂发生重大爆炸事件&#xff0c;引起了社会的广泛关注&#xff0c;现场火势猛烈&#xff0c;浓烟滚滚。应急、消防、公安、医疗、国网电力等相关部门正在全力参与救援。而经此事件&#xff0c;也暴露了很多问题&#xff0c;对此&#xff0c;需要从多…

GPT-4o 客户端替代方案:支持屏幕阅读、麦克风交互 | 开源日报 No.277

onuratakan/gpt-computer-assistant Stars: 4.2k License: MIT gpt-computer-assistant 是一个为 Windows、macOS 和 Ubuntu 提供的 GPT-4o 替代方案。 该项目旨在为用户提供 ChatGPT MacOS 应用程序的替代品&#xff0c;支持在 Windows 和 Linux 系统上运行。 主要功能和优势…

Python 参数类型

一 理解Python中的Parameters & Arguments Parameters&#xff1a;形参 Arguments&#xff1a;实参 二 Python的实参&#xff08;Arguments&#xff09;类型 实参类型总结 位置参数&#xff08;Positional Arguments&#xff09; &#xff1a;函数调用时通过入参的顺序来…

【计算机毕业设计】094图书馆自习室座位预约管理微信小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

华为HCIP Datacom H12-821 卷14

1.判断题 如图所示, 同一局域网中的四台路由器运 IS-IS,其中 R1 是 DIS. 则 R2、R3. R4 分别和 R1 建立邻接关系,R2、R3、 R4 之间不建立邻接关系。 A、对 B、错 正确答案:B 解析: 所有路由器互相都是邻接关系