mysql与MongoDB性能对比,哪个更适合自己

 更新时间:2023年06月03日 13:25:50   投稿:mdxy-dxy  
经常看到有人讨论,mongodb性能不如MySQL,MySQL能不能代替之类的说法 ,其实作为技术人,很不喜欢哪个比哪个好这种说法,基本就是挑事,我们今天一起

MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库。它们各有各的优点,关键是看用在什么地方。所以我们所熟知的那些SQL语句就不适用于MongoDB了,因为SQL语句是关系型数据库的标准语言。

一、简单介绍

1、关系型数据库-MySQL

1、在不同的引擎上有不同的存储方式。
2、查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高。
3、开源数据库的份额在不断增加,mysql的份额页在持续增长。
4、缺点就是在海量数据处理的时候效率会显著变慢。

2、非关系型数据库-MongoDB

非关系型数据库(nosql ),属于文档型数据库。先解释一下文档的数据库,即可以存放xml、json、bson类型系那个的数据。这些数据具备自述性,呈现分层的树状数据结构。数据结构由键值(key=>value)对组成。

1、存储方式:虚拟内存+持久化。
2、查询语句:是独特的MongoDB的查询方式。
3、适合场景:事件的记录,内容管理或者博客平台等等。
4、架构特点:可以通过副本集,以及分片来实现高可用。
5、数据处理:数据是存储在硬盘上的,只不过需要经常读取的数据会被加载到内存中,将数据存储在物理内存中,从而达到高速读写。
6、成熟度与广泛度:新兴数据库,成熟度较低,Nosql数据库中最为接近关系型数据库,比较完善的DB之一,适用人群不断在增长。

4、MongoDB优势与劣势

优势:

1、在适量级的内存的MongoDB的性能是非常迅速的,它将热数据存储在物理内存中,使得热数据的读写变得十分快。
2、MongoDB的高可用和集群架构拥有十分高的扩展性。
3、在副本集中,当主库遇到问题,无法继续提供服务的时候,副本集将选举一个新的主库继续提供服务。
4、MongoDB的Bson和JSon格式的数据十分适合文档格式的存储与查询。

劣势:

1、 不支持事务操作。MongoDB本身没有自带事务机制,若需要在MongoDB中实现事务机制,需通过一个额外的表,从逻辑上自行实现事务。
2、 应用经验少,由于NoSQL兴起时间短,应用经验相比关系型数据库较少。
3、MongoDB占用空间过大。

4、MongoDB和MySQL的对比(区别介绍)

数据库MongoDBMySQL
数据库模型非关系型关系型
存储方式以类JSON的文档的格式存储不同引擎有不同的存储方式
查询语句MongoDB查询方式(类似JavaScript的函数)SQL语句
数据处理方式基于内存,将热数据存放在物理内存中,从而达到高速读写不同引擎有自己的特点
成熟度新兴数据库,成熟度较低成熟度高
广泛度NoSQL数据库中,比较完善且开源,使用人数在不断增长开源数据库,市场份额不断增长
事务性仅支持单文档事务操作,弱一致性支持事务操作
占用空间占用空间大占用空间小
join操作MongoDB没有joinMySQL支持join

性能方便的优化介绍

分别从设计思想、性能、安全性、扩展性、事务等几个方面,来做一下比较:

mongo vs mysql

二、 设计思想的不同

以订单为例,我们看看两种数据库应该怎么设计

MySQL是这样子的

订单表

mysql order表结构

订单详情

order item表结构

以订单号关联字段。

MongoDB是 这样子的

mongo order结构

order_item作为订单的子元素,是一个整体;

在一对一,一对多的场景,特别适合用MongoDB的内嵌文档和数组来存储,读写效率都比较高。

一对多的场景则适合MySQL的表结构来存储。

你觉得那种存储的更合理呢?

三、性能

一般情况同等条件下,MongoDB会比MySQL快 ,主要原因如下:

a.Mongo使用的内存映射技术, 写入数据时候只要在内存里完成就可以返回给应用程序,这样并发量自然就很高。而保存到硬体的操作则在后台异步完成。

b.MongoDB的设计要求你常用的数据(working set)可以放到内存里。这样大部分操作只需要读内存,内存操作当然比较快,这也是MongoDB,经常会和redis比较的原因。前提就是要保证服务器有 足够用的内存,否则性能会严重下降。

c.数据集中存放,减少读写时磁盘寻道的时间,这也是MongoDB的基本思想之一。

并发能力,具体看过有网友测试过,MongoDB和MySQL的并发能力,借鉴一下:

并发测试结果

可见,性能上并没有我们想象的差距那么大,

我没有测试过,有兴趣的网友可以测试一下

四、数据安全性

我们经常看到新闻,MongoDB数据库被黑,被勒索的新闻,为什么呢?

原来MongoDB 3.6版本之前,绑定的0.0.0.0的IP,即直接外网开放,而且我们知道MongoDB默认是没有密码的,所以很多新手弄的服务器就是在裸奔,所以被黑就在所难免的,也不能全怪MongoDB。

通过一些配置,MongoDB还是很安全的

a. 绑定本机IP ,限于局域网访问;

b. 配置防火墙,禁止外部访问和端口探测;

c. 设置合理的用户和分派权限。道理和MySQL一样,遵循最小权限的原则。

五、事务

早期的版本是没有事务的,因为在MongoDB中,对于单条记录的一个操作是原子性的,一般来说,MongoDB将有关联的数据存储在一起,所以很多操作不像MySQL,需要做多表的操作。

从4.0版本开始,MongoDB支持副本集的事务,4.2支持切片的事务;

对于多表事物的需求场景,MongoDB也是支持的,可以在多个分片、库、表、文档之间实现分布式的事务。

分布式事务会严重影响性能,所以要谨慎使用,当需要事务时,优先考虑是否可通过合理使用MongoDB的内嵌文档和数组,降低使用事务的几率。

要了解MongoDB的事务,要先了解 一下MongoDB的集群。

六、扩展性

随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB。对数据的各种操作也是愈加的困难,所以在做数据库选型时,扩展性是必须要考虑的指标:

MongoDB提供了sharded clusters(分片集群) 和 replica sets(副本集)两种集群模式

副本集:

架构图如下,目的是数据冗余和系统高可用,类似于MySQL的主从架构,每个节点的数据是一致的,主负责读写操作,从负责数据的备份,在需要的时候 可转成主节点。

简单主从

如果需要做到故障自动转移,还需要增加一个选举节点,选举节点只负责在主节点出现问题时,把从节点选举为主节点。不负责数据存储。这个和redis的哨兵模式类似。

哨兵模式

关于主从的复制是一个比较复杂的过程,后面有时间再详细介绍。

分片集群:

分片是MongoDB提供的更高级的集群模式,通过分片,把数据分配到不同的机器上,每台机器只存储了部分的数据,通过mongos实现路由去访问。

切片模式架构

这是MySQL没有的功能,类似于MySQL分库分表的功能,通过mycat+mysql实现

6.优势所在

MongoDB数据类型丰富,查询功能强大,还有文本搜索功能和地理空间计算,强大的数据分析和统计能力。

缺点:

没有join ,连表操作能力弱,所以在复杂查询时,还是关系型数据库更胜一筹。

7.隔离级别

这是MySQL里的概念,在MongoDB事务提交前,事务外看不到本次修改的内容,隔离级别类似MySQL默认的隔离级别,“可重复读”的级别。

综上所述,总结一下

什么时候适合用MongoDB:

1. 数据结构不确定,可能发生改动的场景;

2.事务安全性要求不高,数据扩展要求较高的时候;

什么时候用MySQL:

1. 有事务要求,强一致性要求较高,涉及到金钱的时候;

2. 逻辑复杂,有较多join的需求;

没有最好的,只有最合适的,适合自己业务的就是最好的!

相关文章

  • neo4j安装配置入门教程

    neo4j安装配置入门教程

    这篇文章主要为大家详细介绍了neo4j安装配置入门教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • Navicat Premium 15 工具自动被杀毒防护软件删除的两种解决方法

    Navicat Premium 15 工具自动被杀毒防护软件删除的两种解决方法

    这篇文章主要介绍了Navicat Premium 15 工具自动被杀毒防护软件删除的两种解决方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-02-02
  • 利用reverse索引优化like语句的方法详解

    利用reverse索引优化like语句的方法详解

    这篇文章主要介绍了关于利用reverse索引优化like语句的方法,文中通过图文介绍的很详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-03-03
  • 对分区表进行alter-switch时遇到的错误

    对分区表进行alter-switch时遇到的错误

    将一个表的数据加入分区表中,可以通过如下步骤进行
    2009-07-07
  • 复杂SQL实现分组分情况分页查询代码实例

    复杂SQL实现分组分情况分页查询代码实例

    最近学习了一下SQL的分页查询,总结了复杂SQL分组分页查询的方法,这篇文章主要给大家介绍了关于复杂SQL实现分组分情况分页查询的相关资料,需要的朋友可以参考下
    2023-12-12
  • SQLite快速入门指南

    SQLite快速入门指南

    这篇文章主要介绍了SQLite快速入门指南,作为开源的嵌入式数据库,SQLite可以在不需要过多投入数据库开发时提供十分轻便的服务,需要的朋友可以参考下
    2015-07-07
  • 如何利用分析函数改写范围判断自关联查询详解

    如何利用分析函数改写范围判断自关联查询详解

    这篇文章主要给大家介绍了关于如何利用分析函数改写范围判断自关联查询的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用sql具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • 站内群发消息三种不同用户量的数据库设计

    站内群发消息三种不同用户量的数据库设计

    很多SNS网站和一部分CMS网站都广泛地应用了站内信这一模块,这个看似简单的东西其实背后隐藏着很多需要设计师重视的设计细节,要做好这个“邮递员”是很不容易的,本文讲述站内群发消息三种不同用户量的数据库设计,逐渐设计一个百万级用户量的站内信群发数据库
    2023-12-12
  • SQL Server不存在或访问被拒绝问题的解决

    SQL Server不存在或访问被拒绝问题的解决

    最近做一个项目(Asp.net+Sql Server 2000),在原来开发的机器上运行没有任何问题.但当我在另外一台机器上调试程序(本机调试)的时候,总出现“SQL Server不存在或访问被拒绝”。相信在任何一个搜索网站输入这样的检索词,一定会获得n多的页面。
    2008-04-04
  • Hive日期格式转换方法总结

    Hive日期格式转换方法总结

    这篇文章主要为大家介绍了Hive日期格式转换方法总结,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06

最新评论