mongodb的优缺点

2023-11-09

对比mysql, mongo的优缺点有:

缺点

l  不支持事务操作

l  占用空间过大

l  MongoDB没有如MySQL那样成熟的维护工具

l  无法进行关联表查询,不适用于关系多的数据

l  复杂聚合操作通过mapreduce创建,速度慢

| 模式自由,  自由灵活的文件存储格式带来的数据错误

|

  1. 预分配模式带来的磁盘瓶颈。

mongodb采用数据文件预分配模式来生成数据文件,数据文件的大小从64M开始,每增加一个文件,大小翻倍,直到2G,以后每次增加数据就会生成2G左右的数据文件,结合mongodb的mmap内存模型,对于写数据文件,将随机写转换为顺序写,一定程度上缓解了磁盘的io压力。

但在实际使用中,遇到了在预分配2G的数据文件时,如果磁盘io较慢,则mongodb基本锁死,无法响应请求的情况。持续时间则根据磁盘io的性能来确定。这个问题在2.0之后版本可能会有些改善,但在磁盘性能低的服务器上,该问题依旧存在.

这个问题目前没有太好的解决方案,只能建议使用读写性能比较好的服务器来跑mongodb。

 

  1. 在数据存量大于内存大小时,mongodb遇到冷数据查询速度变慢。

mongodb使用mmap的内存管理模式,如果查询的都是热数据,那么会在内存中直接查询,如果遇到冷数据,就需要从磁盘读取,并将一部分热数据从内存卸载掉.

有人曾经说mongodb内存管理是加载固定大小的文件块到内存,即如果冷数据在磁盘上,他会根据请求的数据,加载一定大小的数据块到内存,并卸载掉同样的热数据,这个操作本身会带来一定io.

因为mongodb使用的是全局锁,在某个操作缓慢时,整个操作队列会全部变慢。这个问题造成了mongodb会出现偶发性堵塞问题,连带整个库的性能下降。

         该问题在应用需要尽量避免出现,需要将mongodb的数据大小规划好,尽量不要使数据量超过内存的大小,如果超过内存大小后,尽量不要去请求冷数据。

  1. Mongodb全局锁机制。

mongodb最大的问题或者可以说是它的锁机制,在2.2版本之前,一个实例只有一个读写锁,不管有多少数据库和数据集合,当一个操作进行时其他操作只能等待,在2.2版本后,mongodb锁降低了粒度,改为按库锁。

MongoDB 使用的是“readers-writer”锁, 可以支持并发但有很大的局限性,当一个读锁存在,许多读操作可以使用这把锁,然而, 当一个写锁的存在,一个单一的写操作会exclusively 持有该锁,同时其它读,写操作不能使用共享这个锁;举个例子,假设一个集合里有 10 个文档,多个 update 操作不能并发在这个集合上,即使是更新不同的文档。

 

  1. 删除数据集合后空间不会自动释放

mongodb删除集合后磁盘空间不释放,只有用db.repairDatabase()去修复才能释放。

修复可能要花费很长的时间,在使用db.repairDatabase()去修复时一定要停掉读写,并且mongodb要有备机才可以,不然千万不要随便使用db.repairDatabase()来修复数据库,切记。

但是在修复的过程中如果出现了非正常的mongodb的挂掉,再次启动时启动不了的,需要先修复才可以,可以利用./mongod --repair --dbpath=/data/mongo/ 如果你是把数据库单独的放在一个文件夹中指定dbpath时就指向要修复的数据库就可以。

 

7. replica set一些隐含问题

                   a) replica set模式最多支持12台服务器,而有投票权的服务器只支持7台,如果超过7台服务器,需设置部分服务器为无投票权服务器

                   b) replica set模式中,一个set服务器如果小于2台服务器,则自动故障恢复不会起作用,如果4台服务器出现2/2互相ping不通的情况,同样不会自动故障恢复。一般来说,一个set中尽量是有单数服务器。

                   c). replica set中,因为mongodb是按照时间进行操作,如果set中某个服务器时间超前或者延迟,很容易出现secondaries不断尝试更新oplog或者同步延迟的问题。甚至造成某些操作失败,如drop操作。

         8. 分片模式的一些隐含问题

                   1. config server尽量按照官方的要求,有3个configserver,如果只有2个configserver,则shard的自动负载均衡和自动切片功能不可用。

                   2. api中的nearest模式在shard中,判断的是set到mongos的距离而非set到client的距离,在切片模式下,尽量不要使用nearest模式,可能会造成一些请求延迟增加的问题。

优点

l  文档结构的存储方式,能够更便捷的获取数据

l  内置GridFS,支持大容量的存储

l  内置Sharding,分片简单

l  海量数据下,性能优越

l  支持自动故障恢复(复制集)

 

mongodb是一个介于nosql数据库和mysql数据库之间的一个数据存储系统,它没有严格的数据格式,但同时支持复杂查询,而且自带sharding模式和Replica Set模式,支持分片模式,复制模式,自动故障处理,自动故障转移,自动扩容,全内容索引,动态查询等功能。扩展性和功能都比较强大。

    mongodb在数据查询方面,支持类sql查询,可以一个key多value内容,可以组合多个value内容来查询,支持索引,支持联合索引,支持复杂查询 ,支持排序,基本上除了join和事务类型的操作外,mongodb支持所有mysql支持的查询,甚至某个客户端api支持直接使用sql语句查询mongodb。

         mongodb的sharding功能目前日渐完善,支持自定义范围分片,hash自动分片等,分片自动扩容,shard之间自动负载均衡等功能。实际使用中功能还不错。




https://www.cnblogs.com/shijingxiang/articles/5197920.html


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mongodb的优缺点 的相关文章

随机推荐

  • 自定义easyui默认Loading及数据为空提示

    1 添加Loading遮罩层 默认Loading效果较简单 想要改变时 需要自定义Loading 2 自定义Loading 基本配置中定义 无数据时显示的提示信息 var emptyHtml div class empty data img
  • c++学习之函数模板案例--选择排序

    代码示例 include
  • 数组和指针的区别与联系(详细)

    一 概念 数组 数组是用于储存多个相同类型数据的集合 指针 指针相当于一个变量 但是它和不同变量不一样 它存放的是其它变量在内存中的地址 二 赋值 存储方式 求sizeof 初始化等 1 赋值 同类型指针变量可以相互赋值 数组不行 只能一个
  • mac charles永久激活码

    Registered Name https zhile io License Key 48891cf209c6d32bf4 https charles wrbug com charles 激活码在线生成
  • Crouse

    Yes
  • 设置ubuntu终端的命令行颜色

    第一步 sudo gedit bashrc 更改第43行 force color prompt yes 去掉注释 PS1将使用配色方案 PS1 debian chroot debian chroot debian chroot 033 01
  • 第五十二章 Unity Input System 新输入系统

    新输入系统InputSystem是2019年Unity新推出的插件 请注意 Unity默认使用旧的Input Manager 新的Input System处于未启用状态 当你安装Input System组件时 Unity会询问你是否启用新的
  • ubuntu-1804 配置 opevcv-4.0记录

    1 opencv安装包下载及解压 镜像地址 注意opencv contrib版本一致 下载zip压缩包 unzip opencv 4 0 0 zip unzip opencv contrib 4 0 0 解压后可以将版本号去掉 路径看起来好
  • 4399游戏Web前端工程师2021秋招面经

    4399游戏Web前端工程师2021秋招面经 概要 初面 hr面 复面 终面 总结 概要 由于4399秋招有单独开华工专场 所以很幸运免去了笔试 主要的流程是 笔试 初面 基础知识技术面 hr 面 复面 部门技术面 终面 类似主管面 我也不
  • python爬虫--破解登录环节的js加密:haodou

    看到一个网站的登录环节做了密码的加密 尝试着做了破解 权当对js破解的一个练习 网站 http www haodou com 登录url下面看到data如下 其中password和sso token明显是加密后的数据 搜索sso token
  • @Mapper注解

    目录 mybatis支持的映射方式有基于xml的mapper xml文件 基于java的使用Mapper接口class 从mybatis3 4 0开始加入了 Mapper注解 目的就是为了不再写mapper映射文件 接口方法注解主要是四个
  • [windbg] windbg symbol符号配置

    Symbol information 需翻墙
  • Spring源码学习-SpringBoot原理解析

    目录 SpringBoot 启动注解 EnableAutoConfiguration AutoConfigurationPackage Import AutoConfigurationImportSelector class Tomcat和
  • div contenteditable 限制文本框输入的文字个数

  • Flask 打印动态url内容

    Flask 文档 英文 http flask pocoo org docs 0 10 quickstart variable rules 中文 http www pythondoc com flask quickstart html id4
  • Git 第一次提交代码到远程分支

    1 创建远程仓库名称 创建远程仓库名称 2 复制远程仓库链接 这个链接到最后把本地库与远程库关联的时候要使用 复制远程仓库链接 3 到你要上传远程仓库的项目文件中点击右键 选择Git Bash Here 右键上传项目 右键选择Git Bas
  • Android学习之路-常用布局方式(4)

    设置视图间距有两种方式 layout margin 它指定了当前视图与周围平级视图之间的距离 包括 layout marginLeft layout marginTop layout marginRight layout marginBot
  • 微软 WSL 重装操作系统

    如果你对 WSL 还不怎么了解的话 请自行脑补下 简单理解就是 WSL 主要为了让你能够在 Windows 系统中运行 Linux 为什么需要这样 这是因为很多时候一些环境需要在 Linux 下运行 操作系统重装 如果希望对操作系统进行重装
  • 有关音频编码的知识与技术参数

    自然界中的声音非常复杂 波形极其复杂 通常我们采用的是脉冲代码调制编码 即PCM编码 PCM通过抽样 量化 编码三个步骤将连续变化的模拟信号转换为数字编码 1 什么是采样率和采样大小 位 bit 声音其实是一种能量波 因此也有频率和振幅的特
  • mongodb的优缺点

    对比mysql mongo的优缺点有 缺点 l 不支持事务操作 l 占用空间过大 l MongoDB没有如MySQL那样成熟的维护工具 l 无法进行关联表查询 不适用于关系多的数据 l 复杂聚合操作通过mapreduce创建 速度慢 模式自