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

寻技术 Mysql / MongoDB 2023年09月09日 54

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的对比(区别介绍)

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

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

关闭

用微信“扫一扫”