mongodb与MySQL的不同_Mongodb与MySQL之间的比较分析

mongodb与MySQL的不同_Mongodb与MySQL之间的比较分析本篇文章给大家带来的内容是关于Mongodb与MySQL之间的比较分析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。在数据库存放的数据中,有一种特殊的键值叫做主键,它用于惟一地标识表中的某一条记录。也就是说,一个表不能有多个主键,并且主键不能为空值。无论是MongoDB还是MySQL,都存在着主键的定义。对于MongoDB来说,其主键名叫”_id”,在生成数据的时候,如果用户不主…

大家好,又见面了,我是你们的朋友全栈君。

本篇文章给大家带来的内容是关于Mongodb与MySQL之间的比较分析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

在数据库存放的数据中,有一种特殊的键值叫做主键,它用于惟一地标识表中的某一条记录。也就是说,一个表不能有多个主键,并且主键不能为空值。无论是MongoDB还是MySQL,都存在着主键的定义。

对于MongoDB来说,其主键名叫”_id”,在生成数据的时候,如果用户不主动为其分配一个主键的话,MongoDB会自动为其生成一个随机分配的值。

在MySQL中,主键的指定是在MySQL插入数据时指明PRIMARY KEY来定义的。当没有指定主键的时候,另一种工具 —— 索引,相当于替代了主键的功能。索引可以为空,也可以有重复,另外有一种不允许重复的索引叫惟一索引。如果既没有指定主键也没有指定索引的话,MySQL会自动为数据创建一个。

存储速度对比

1、数据库的平均插入速率:MongoDB不指定_id插入 > MySQL不指定主键插入 > MySQL指定主键插入 > MongoDB指定_id插入。

2、MongoDB在指定_id与不指定_id插入时速度相差很大,而MySQL的差别却小很多。

分析:

1、在指定_id或主键时,两种数据库在插入时要对索引值进行处理,并查找数据库中是否存在相同的键值,这会减慢插入的速率。

2、在MongoDB中,指定索引插入比不指定慢很多,这是因为,MongoDB里每一条数据的_id值都是唯一的。当在不指定_id插入数据的时候,其_id是系统自动计算生成的。MongoDB通过计算机特征值、时间、进程ID与随机数来确保生成的_id是唯一的。而在指定_id插入时,MongoDB每插一条数据,都需要检查此_id可不可用,当数据库中数据条数太多的时候,这一步的查询开销会拖慢整个数据库的插入速度。

3、MongoDB会充分使用系统内存作为缓存,这是一种非常优秀的特性。我们的测试机的内存有64G,在插入时,MongoDB会尽可能地在内存快写不进去数据之后,再将数据持久化保存到硬盘上。这也是在不指定_id插入的时候,MongoDB的效率遥遥领先的原因。但在指定_id插入时,当数据量一大内存装不下时,MongoDB就需要将磁盘中的信息读取到内存中来查重,这样一来其插入效率反而慢了。

4、MySQL不愧是一种非常稳定的数据库,无论在指定主键还是在不指定主键插入的情况下,其效率都差不了太多。

插入稳定性分析

插入稳定性是指,随着数据量的增大,每插入一定量数据时的插入速率情况。

在本次测试中,我们把这个指标的规模定在10w,即显示的数据是在每插入10w条数据时,在这段时间内每秒钟能插入多少条数据。

先呈现四张图上来:

1、 MongoDB指定_id插入:

239e282a42c7ddc28fe780a867a64bc2.png

2、 MongoDB不指定_id插入:

62d05b841c4a76f7887f8da75fd4bb1d.png

3、 MySQL指定PRIMARY KEY插入:

d3c2c10164b98b604d207ea4d2f5074a.png

4、 MySQL不指定PRIMARY KEY插入:

8d8fada6f97440fab243dcef2e003112.png

总结:

1、整体上的插入速度还是和上一回的统计数据类似:MongoDB不指定_id插入 > MySQL不指定主键插入 > MySQL指定主键插入 > MongoDB指定_id插入。

2、从图中可以看出,在指定主键插入数据的时候,MySQL与MongoDB在不同数据数量级时,每秒插入的数据每隔一段时间就会有一个波动,在图表中显示成为规律的毛刺现象。而在不指定插入数据时,在大多数情况下插入速率都比较平均,但随着数据库中数据的增多,插入的效率在某一时段有瞬间下降,随即又会变稳定。

3、整体上来看,MongoDB的速率波动比MySQL的严重,方差变化较大。

4、MongoDB在指定_id插入时,当插入的数据变多之后,插入效率有明显地下降。在其他三种的插入测试中,从开始到结束,其插入的速率在大多数的时候都固定在一个标准上。

分析:

1、毛刺现象是因为,当插入的数据太多的时候,MongoDB需要将内存中的数据写进硬盘,MySQL需要重新分表。这些操作每当数据库中的数据达到一定量级后就会自动进行,因此每隔一段时间就会有一个明显的毛刺。

2、MongoDB毕竟还是新生事物,其稳定性没有已应用多年的MySQL优秀。

3、MongoDB在指定_id插入的时候,其性能的下降还是很厉害的。

4、在读取的数据规模不大时,MongoDB的查询速度真是一骑绝尘,甩开MySQL好远好远。

5、在查询的数据量逐渐增多的时候,MySQL的查询速度是稳步下降的,而MongoDB的查询速度却有些起伏。

分析:

1、如果MySQL没有经过查询优化的话,其查询速度就不要跟MongoDB比了。MongoDB可以充分利用系统的内存资源,我们的测试机器内存是64GB的,内存越大MongoDB的查询速度就越快,毕竟磁盘与内存的I/O效率不是一个量级的。

2、本次实验的查询的数据也是随机生成的,因此所有待查询的数据都存在MongoDB的内存缓存中的概率是很小的。在查询时,MongoDB需要多次将内存中的数据与磁盘进行交互以便查找,因此其查询速率取决于其交互的次数。这样就存在这样一种可能性,尽管待查询的数据数目较多,但这段随机生成的数据被MongoDB以较少的次数从磁盘中取出。因此,其查询的平均速度反而更快一些。这样看来,MongoDB的查询速度波动也处在一个合理的范围内。

3、MySQL的稳定性还是毋庸置疑的。

结论

1、相比较MySQL,MongoDB数据库更适合那些读作业较重的任务模型。MongoDB能充分利用机器的内存资源。如果机器的内存资源丰富的话,MongoDB的查询效率会快很多。

2、在带”_id”插入数据的时候,MongoDB的插入效率其实并不高。如果想充分利用MongoDB性能的话,推荐采取不带”_id”的插入方式,然后对相关字段作索引来查询。

3、MongoDB适合那些对数据库具体数据格式不明确或者数据库数据格式经常变化的需求模型,而且对开发者十分友好。

4、MongoDB官方就自带一个分布式文件系统,可以很方便地部署到服务器机群上。MongoDB里有一个Shard的概念,就是方便为了服务器分片使用的。每增加一台Shard,MongoDB的插入性能也会以接近倍数的方式增长,磁盘容量也很可以很方便地扩充。

5、MongoDB还自带了对map-reduce运算框架的支持,这也很方便进行数据的统计。

MongoDB的缺陷

1、事务关系支持薄弱。这也是所有NoSQL数据库共同的缺陷,不过NoSQL并不是为了事务关系而设计的,具体应用还是很需求。

2、稳定性有些欠缺,这点从上面的测试便可以看出。

3、MongoDB一方面在方便开发者的同时,另一方面对运维人员却提出了相当多的要求。业界并没有成熟的MongoDB运维经验,MongoDB中数据的存放格式也很随意,等等问题都对运维人员的考验。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149221.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 密码加密方式

    密码加密方式密码加密方式

    2022年4月22日
    79
  • Vue上传文件遇到的问题[通俗易懂]

    Vue上传文件遇到的问题[通俗易懂]问题之前项目中前端使用了vue-cli,引入了上传组件,所以在上传文件时很容易,没有考虑太多问题。image-cropper组件中有url属性,直接使用:url=”文件服务器地址”绑定上传的地址即可。<el-form-itemlabel=”讲师头像”><!–头衔缩略图–><pan-thumb:image=”teacher.avatar”/><!–文件上传按钮–><el-buttontype=

    2022年10月9日
    3
  • cglib动态代理实现原理_动态代理的两种方式

    cglib动态代理实现原理_动态代理的两种方式CGLib动态代理原理CGLib动态代理是代理类去继承目标类,然后重写其中目标类的方法啊,这样也可以保证代理类拥有目标类的同名方法;看一下CGLib的基本结构,下图所示,代理类去继承目标类,每次调用代理类的方法都会被方法拦截器拦截,在拦截器中才是调用目标类的该方法的逻辑,结构还是一目了然的;1.CGLib的基本使用使用一下CGLib,在JDK动态代理中提供一个Proxy类来创建代理类,而在CGLib动态代理中也提供了一个类似的类Enhancer;使用的CGLib版本是2.2.2,我是随便找的,不

    2022年8月30日
    1
  • 内网渗透的步骤_内网渗透思路

    内网渗透的步骤_内网渗透思路0x00Preface内网渗透主要是基于前期外围打点getshell的webserver,通过收集webserver上的信息,然后对其他内网主机进行口令上的攻击,当然也有一些基于漏洞的攻击。内网相关概念这里不再进行介绍,大家可以自行百度,诸如什么是域、域与工作组的区别、什么是DC、什么是AD等。当然,概念是生涩难懂的,结合实际环境会有助于理解。0x01信息收集systeminfo查看系统详细信息,如OS版本、补丁安装情况,可以根据这些信息筛选可利用的漏洞。netstart查看启动进

    2022年9月14日
    3
  • SQL LIKE的用法

    SQL LIKE的用法LIKE 是另一个在 WHERE 子句中会用到的指令。基本上,LIKE 能让我们依据一个套式(pattern)来找出我们要的资料。相对来说,在运用 IN 的时候,我们完全地知道我们需要的条件;在运用 BETWEEN 的时候,我们则是列出一个范围。 LIKE 的语法如下:SELECT”栏位名” FROM”表格名” WHERE”栏位名”LIKE{套式}{套式}经

    2022年7月26日
    6
  • 第十五章《键的管理》

    第十五章《键的管理》

    2021年5月29日
    87

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号