首页 数据库 mysql教程 Mongodb与MySQL之间的比较分析

Mongodb与MySQL之间的比较分析

Dec 21, 2018 am 10:33 AM
mongodb mysql

本篇文章给大家带来的内容是关于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插入:

3698265246-5c18c930c24be_articlex.png

2、       MongoDB不指定_id插入:

433988552-5c18c95118085_articlex.png

3、     MySQL指定PRIMARY KEY插入:

3219219152-5c18c9587f2da_articlex.png

4、     MySQL不指定PRIMARY KEY插入:

498345355-5c18c95f88977_articlex.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中数据的存放格式也很随意,等等问题都对运维人员的考验。

以上是Mongodb与MySQL之间的比较分析的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

Rimworld Odyssey温度指南和Gravtech
1 个月前 By Jack chen
初学者的Rimworld指南:奥德赛
1 个月前 By Jack chen
PHP变量范围解释了
4 周前 By 百草
撰写PHP评论的提示
3 周前 By 百草
在PHP中评论代码
3 周前 By 百草

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Laravel 教程
1604
29
PHP教程
1509
276
MongoDB的交易是什么,它们如何为多文档操作提供酸性? MongoDB的交易是什么,它们如何为多文档操作提供酸性? Jul 31, 2025 am 06:25 AM

MongoDBintroducedmulti-documenttransactionsinversion4.0,enablingatomicoperationsacrosscollectionsforstrongconsistency.Transactionsallowmultipleread/writeoperationstobegroupedasasingleunit,eitherallsucceedingorfailingtogether.Theyaresupportedinreplica

用对象级特权确保MySQL 用对象级特权确保MySQL Jul 29, 2025 am 01:34 AM

TosecureMySQLeffectively,useobject-levelprivilegestolimituseraccessbasedontheirspecificneeds.Beginbyunderstandingthatobject-levelprivilegesapplytodatabases,tables,orcolumns,offeringfinercontrolthanglobalprivileges.Next,applytheprincipleofleastprivile

了解MongoDB存储引擎:Wiredtiger Deep Dive 了解MongoDB存储引擎:Wiredtiger Deep Dive Aug 04, 2025 am 05:49 AM

WiredTigerisMongoDB’sdefaultstorageenginesinceversion3.2,providinghighperformance,scalability,andmodernfeatures.1.Itusesdocument-levellockingandMVCCforhighconcurrency,allowingreadsandwritestoproceedwithoutblockingeachother.2.DataisstoredusingB-trees,

优化内容管理系统(CMS)的MySQL 优化内容管理系统(CMS)的MySQL Jul 28, 2025 am 03:19 AM

ToimproveMySQLperformanceforCMSplatformslikeWordPress,firstimplementacachinglayerusingpluginslikeRedisorMemcached,enableMySQLquerycaching(ifapplicable),andusepagecachingpluginstoservestaticfiles.Second,optimizeMySQLconfigurationbyincreasinginnodb_buf

管理大型MySQL表的最佳实践 管理大型MySQL表的最佳实践 Aug 05, 2025 am 03:55 AM

处理大表时,MySQL性能和可维护性面临挑战,需从结构设计、索引优化、分表策略等方面入手。1.合理设计主键和索引:推荐使用自增整数作为主键以减少页分裂;使用覆盖索引提升查询效率;定期分析慢查询日志并删除无效索引。2.分区表的合理使用:按时间范围等策略分区,提升查询和维护效率,但需注意分区裁剪问题。3.考虑读写分离和分库分表:读写分离缓解主库压力,分库分表适用于数据量极大场景,建议使用中间件并评估事务和跨库查询问题。前期规划和持续优化是关键。

确保您的MongoDB部署:全面的清单 确保您的MongoDB部署:全面的清单 Aug 01, 2025 am 02:50 AM

启用身份验证和基于角色的访问控制(RBAC),使用SCRAM创建最小权限用户并定期轮换凭证;2.限制网络访问,绑定内网IP并配置防火墙或云安全组仅允许受信任IP连接;3.启用数据静态和传输加密,使用TLS/SSL及MongoDB原生或文件系统级加密;4.加固配置并禁用危险功能,如关闭HTTP接口、禁用本地认证绕过并以非root用户运行;5.启用审计日志并集中收集,设置失败登录、未授权访问等告警;6.定期测试验证,执行扫描、渗透测试、季度权限审查并保持版本更新。遵循此清单可消除多数导致breach

在Mac上设置MongoDB 在Mac上设置MongoDB Aug 01, 2025 am 03:41 AM

installhomebrewifnotalreadyinstall,thenrunbrewtapmongodb/brewandbrewinstallmongodb-communitytoinstallmongodb.2.starttarttheservicewithbrewservicewithbrewservicesstartmongodb-com--c---------------------

MySQL中的截断,删除和掉落有什么区别? MySQL中的截断,删除和掉落有什么区别? Aug 05, 2025 am 09:39 AM

DELETEremovesspecificorallrows,keepstablestructure,allowsrollbackandtriggers,anddoesnotresetauto-increment;2.TRUNCATEquicklyremovesallrows,resetsauto-increment,cannotberolledbackinmostcases,doesnotfiretriggers,andkeepstablestructure;3.DROPremovesthee

See all articles