`

MongoDB的真正性能

 
阅读更多

最近开始研究MySQL和MongoDB,发现这方面资料不多。尤其是真正的说到点子上的文章,太少了。

有一些对比测试的文章基本上都是瞎测,测试方法都测到了马腿上,得出的结论基本上都是NoSQL毫无价值

容我借用Russell Smith 的那句话:不是MongoDB不行,是你不懂。

让我来分析一下MongoDB的真正性能吧。

有说MongoDB慢

  反对:不设其他唯一索引的情况下,只用_id 在普通办公电脑上每秒插入几万,在普通x86服务器上每秒插入十几万,你好意思说这个性能低?比mysql强出一个数量级。

      赞同:检索是真的慢,和sql数据库不同,越复杂的条件搜索MangoDB越吃亏,CPU和IO的双重压力。面对那些直接把SQL查询改写成MangoDB的用法,别转了,你不会收获任何性能提升。

      你不行:说你不行还是真的不行,MongoDB领导了NoSQL运动,NoSQL请注意,我们最主要反对的就是SQL的方法论,按SQL方法使用MangoDB你只能收获失望。再想想MongoDB的设计思想:文档化。_id 就是文件名,MongoDB是个文件系统。全文检索?别闹了,用文件名找文件,一个文件名对应一个文件,你绝对不会失望。

那么MongoDB究竟应该怎么用呢?

首先,忘记SQL

你应该忘记你学过的那些优雅无敌的SQL,不是说为了提升检索性能,扔索引就有好处。

有一个简单的事实如下:只有一个默认的_id 索引,此时插入性能为1,你再加一个索引,插入性能约1/2,再加一个约1/3 ,以此类推......

如果这个事实对你是很震撼的,那说明你还没有忘记SQL,接着忘。

MongoDB的索引对插入性能有着不可忽略的拖后腿效应,所以,我们应该使用且仅使用 _id 作为插入key,作为查询key,作为所有的那个key。

其次,直接忘记搜索这件事。

把MongoDB当做你的硬盘,给他文件名去操作文件.这就是Key-Value数据库的做法,你稍加设计就能这么用。

那么其实你所有的操作可以简化为两个指令,逻辑上 就是一个字典

你给他_id,往字典里插一个数据,或者拿一个数据。

Save({_id:xxx,.....})

FindOne({_id:xxx})

要想高性能,善用那个_id,把你原来准备当主键的那个玩意,hash成_id.

把你原来准备的查询条件,什么?查询,拿_id来,别的全砍掉。

第三、这不是数据表

记住,这不是数据表,一个_id对应的东西不是一行数据,而是一个文件。

文件存储和表存储有什么不同呢?

我举个例子,比如我们要存储用户列表和每个用户的道具列表。

数据表的做法是建一张用户表,一张道具表,道具表里有个字段表示他属于哪个用户。

然后,你就离不开万恶的查询了。

然后如果一个用户有100条道具,100万用户意味着道具表有一亿条记录。

这时候就开始考验你的小数据库了,但这都是过去式了,这一亿的道具,用MongoDB,根本不是个事儿

因为MongoDB的方法是当做文件存,只设计一个用户集合,每个用户的信息是一个文件,然后这100个道具就分开存在每个用户的文件里。

然后来比较一下,我们取得用户的记录,然后从中拿出100个道具,NoSQL方法。

查一亿的表,找出属于某个用户的记录。

熟快熟慢?

然后你可能回想,SQL方法,我也可以搞个道具字段,把用户的100个道具用某种协议打包,然后操作啊,一样可以取得巨大的优化呀。

没错,你的想法很好,你正在用NOSQL的方式用SQL。

第四、文件存储的精华之处

如果问题止于此处,MongoDB就毫无优势可言了,如果这个方法在SQL数据库上也是如此容易使用,那还费劲搞MongoDB干什么?

我们再折腾一点,如果每个道具还要存100条转手记录,你还是可以打包,但你这个打包字段已经1M了。

于是每次存取这个打包字段都是一个系统工程了,还要负担1M的流量。

MongoDB这边呢?我们可以直接对文件的一部分进行读写,比如我只返回一个用户的第二个道具的信息,和返回第二个道具的第1~30条转手记录。

这,是一种怎样的差距啊。

你想要一张美女的照片,你朋友有,但是他只有一个压缩包,他那里没有解包工具,于是他把整个包传给了你。他想问你要一张照片,但是他没有压缩工具,为了存档需要,他让你再压进包里传给他。

这个朋友就是你的用户表的一行,如果换成真实世界的事件是多么的不可思议,这就是在一个字段里打包数据的问题。

MongoDB的一条记录就是一个脑筋更正常的朋友,你要他一张照片,他从包里找出来给你。你给他一张照片,他分门别类的放置到他的包里去。

用文件的思维去访问,MongoDB是一个更好的朋友。

审视一下你项目中的大部分的数据需求,是不是都可以用这种方式去组织呢?

如果是,加入NOSQL吧,我们的口号是:很暴力不SQL

还有什么好处 

1.不用逻辑关心的水平切分

  无需多言,对MongoDB而言,这是运维人员的工作了

2.不用对齐的数据结构

  不用对齐意味着你不用为以前表结构变化的迁移烦恼,有些文件里有一个部分,有些没有,这对MongoDB而言,很正常。

分享到:
评论

相关推荐

    mongodb入门

    MongoDB是一种流行的开源NoSQL数据库系统,它以其高性能、高可用性和易扩展性而受到开发者的青睐。MongoDB使用了一种叫做BSON(类似于JSON)的格式来存储数据,它的数据模型与传统的关系型数据库有所不同,更贴近于...

    MongoDB基础了解.docx

    MongoDB是一款开源的NoSQL数据库系统,它基于分布式文件存储,旨在为Web应用程序提供一种可扩展且高性能的数据存储方案。MongoDB融合了关系型数据库的一些特性,同时也具备NoSQL数据库的优势,使其成为处理大量非...

    mongodb快速入门

    值得注意的是,MongoDB在创建数据库方面采取懒惰模式,即只有当首次插入数据时,数据库才真正被创建。 **二、数据操作** #### 向聚集中插入数据 MongoDB中的数据以文档形式存储,这些文档集合在被称为“集合”...

    一个真正开源的MongoDB替代品.zip

    MongoDB是一款广受欢迎的NoSQL数据库,以其高性能、高可用性和灵活的数据模型赢得了开发者们的青睐。然而,MongoDB的一些商业特性,如企业级安全和高级支持,可能对一些开源项目或预算有限的组织来说并不友好。在...

    MongoDB中的分页–如何真正避免性能下降?

    MongoDB是一种流行的开源文档数据库,以其灵活性、可扩展性和高性能而受到广大开发者的青睐。在处理大量数据时,分页是提高用户体验的关键技术,尤其是在Web应用程序中。然而,不正确的分页实现可能会导致性能下降。...

    mongodb 数据库基本操作.docx

    由于其灵活性和高性能,MongoDB被广泛应用于各种场景之中。下面将详细介绍MongoDB的基本操作方法,帮助用户更好地理解和掌握如何使用MongoDB进行数据库管理。 #### 二、连接MongoDB 要开始使用MongoDB,首先需要与...

    MongoDB的Linux安装、基本操作.docx

    MongoDB是一款非常流行的开源NoSQL数据库系统,它以其高度的灵活性、高性能和易于扩展等特点著称,在现代应用开发中有着广泛的应用。对于那些需要处理大量非结构化数据或者希望摆脱传统关系型数据库限制的应用来说,...

    MongoDB数据库基本操作方法

    MongoDB作为一款非常灵活且高性能的NoSQL数据库系统,其丰富的功能不仅能满足日常开发需求,还能支持复杂的数据处理任务。掌握上述基本操作是使用MongoDB的关键步骤,通过不断实践和深入学习,开发者能够更高效地...

    python使用mongoDB

    MongoDB 是一个基于分布式文件存储的开源数据库系统,非常适合处理大量数据,并能提供高性能的数据读写操作。Python 社区提供了多个库来支持与 MongoDB 的交互,其中最常用的是 `pymongo`。 #### 二、基本操作 1. ...

    springboot集成mongodb

    SpringBoot集成MongoDB是现代Java开发中常见的技术组合,它为开发者提供了...通过阅读这些材料,你可以深入学习如何利用这个组合来构建高性能、可扩展的应用程序。记住,实践中不断探索和学习,才能真正掌握这些技术。

    Node + MongoDB 天气小站 快速建站指南 PPT

    Node.js与MongoDB是两种流行的开源技术,通常结合使用来...本指南介绍了一个简易的天气小站建站流程,不过在实践中,还需要考虑安全性、性能优化、错误处理及用户体验等多方面因素,才能构建出真正稳定的生产级应用。

    MongoDB的数据库与集合的基本操作.pdf

    MongoDB是一种流行的开源文档型数据库,它以JSON格式存储数据,具有高性能、高可用性和可扩展性的特点。本文将深入探讨MongoDB中的数据库与集合的基本操作。 1. 创建数据库: 在MongoDB中,创建数据库非常简单,只...

    JSON文档数据库ToroDB.zip

    NoSQL 一样重复造轮子无模式数据库存储大量的重复元数据,ToroDB 只存储一次因为基于 PostgreSQL 开发,确保真正的可用性和事务支持JSON 查询简单还不够,还支持更新操作与 MongoDB 的性能比较: 标签:...

    MongoDB的创建、更新和删除

    MongoDB是一种流行的分布式文档型数据库,它以JSON格式存储数据,具有灵活性和高性能。在MongoDB中,数据操作主要包括创建(Create)、查询(Read)、更新(Update)和删除(Delete),也就是常说的CRUD操作。本文...

    mongodb replica set 配置高性能多服务器详解

    MongoDB的Replica Set是一种高可用性和数据冗余的解决方案,它可以确保在多个服务器之间复制数据,从而提高系统的性能和容错能力。与Master-Slave模式不同,Replica Set可以自动实现故障转移和恢复,增加了系统的...

    Mongodb开发视频教程-第八讲(学云网配套源.ppt

    MongoDB 是一种流行的开源文档型数据库,以其灵活性和高性能而受到广大开发者的青睐。在本节MongoDB开发视频教程中,主要讲解了两个关键概念:`$where`子句的使用以及游标的处理方法。 首先,`$where`子句是MongoDB...

    我的学习资料打包,包括ES,MongoDB,Oracle,TS,NodeJS相关的学习过程

    在本压缩包中,你将找到一系列关于编程和数据库管理技术的学习资料,涵盖了从基础到进阶的不同层次。以下是对每个技术领域的详细说明: ...记得理论与实践相结合,不断探索和实践,才能真正掌握这些技术。

    MongoDB快速入门笔记(二)之MongoDB的概念及简单操作

    如果你尝试切换到一个不存在的数据库,MongoDB会自动创建它,但只有在你创建集合并插入数据时,该数据库才会真正被占用空间。 4. `show collections`命令用来显示当前数据库中的所有集合。集合是文档的容器,相当于...

    MongoDB数据库两阶段提交实现事务的方法详解

    MongoDB是一种分布式文档型数据库,它支持多种数据模型,包括文档、集合和图形。在MongoDB中,单个文档的写操作是原子性的,这意味着在一个文档内的修改要么全部完成,要么全部不完成,保证了数据一致性。然而,当...

    MongoDB CRUD操作中的插入实例教程

    这三个方法都可以用来插入单个或多个文档,但它们在性能和功能上有所区别: insertMany() 方法用于插入多个文档,类似于批处理。如果在批量插入过程中遇到错误,它会根据ordered参数的不同表现出不同的行为。当...

Global site tag (gtag.js) - Google Analytics