`
fantaxy025025
  • 浏览: 1308900 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

MongoDB的真正性能-不是MongoDB不行,是你不懂

 
阅读更多

=

找了好久,终于发现写到电子上的文。

=

MongoDB的真正性能 https://www.cnblogs.com/crazylights/archive/2013/05/08/3066056.html

最近开始研究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不行,而是你不懂!

    然而它的高性能、易部署、易使用这些优点同样是不容忽视的。于是就有了RussellSmith——MongoDBMaster,在一片嘘声中为我们带来MongoDB“诟病”的全面分析,并一一提出了解决方案。近期MongoDB在HackNews上是频繁中...

    一张图看懂微服务架构路线.docx

    通过以上内容,我们可以看出微服务架构不仅仅是一种技术趋势,更是应对现代软件挑战的有效手段。从Docker到API网关,再到分布式追踪和云供应商的选择,每一个环节都至关重要。希望本文能够为读者提供一条清晰的学习...

    基于react-native的购物阅读APP

    React-Native通过JavaScript Native Interface (JSI)与平台的原生代码交互,实现了高效性能和接近原生的用户体验。 在登录注册功能方面,项目可能采用了React Hooks,如useState和useEffect,来管理组件的状态和...

    一文读懂mysql数据库

    ### 一文读懂MySQL数据库 #### 什么是数据库? 数据库是一种用于组织、存储和管理数据的电子系统或服务。它能够确保数据的安全性、可靠性和高效访问。随着信息技术的发展,数据库技术已经成为现代信息管理系统的...

    重整工具箱:从开源软件到开放服务-李道兵

    - **前端部分**: 虽然李道兵表示自己不懂前端,但这一领域同样面临着从传统软件向云服务的转变。 #### 发展趋势预测 李道兵认为未来的软件和服务将更加紧密地结合在一起,并提出了几种可能的形式: - **不是PaaS*...

    汽车网1html为前台页面懂车帝100%

    "懂车帝100%"可能是这个页面的某个特定目标或质量标准,意味着它在满足用户对汽车信息需求方面达到了全面且深入的程度。 描述中提到的“分布式框架”是现代大型网站架构的关键元素。在Java技术栈中,分布式框架如...

    强推!超值!!!36个各类型网站源代码.zip

    这是一个非常实用的资源集合,包含了36个不同类型的网站源代码,对于想要学习网页开发...记住,学习源代码不仅是看懂代码,更关键的是理解背后的逻辑和设计原则,这样你才能真正地掌握这些技术,并应用到实际工作中。

    BT搜索引擎ssbc.zip

    早期数据库采用了MongoDB,因为配合Python读写数据很方便,也不用关注数据结构,搜索功能采用自带的关键词搜索,不过后来随着资源数量增加,性能也明显跟不上。今年换了WiredTiger引擎,自带的fulltext search还是不...

    spring-framework-4.2.1.RELEASE.rar

    Spring的DI允许开发者在运行时通过配置文件或注解来管理对象及其依赖关系,而不是硬编码这些依赖。这样,代码变得更加灵活,易于测试和维护。AOP则是Spring提供的一种解决横切关注点(如日志、事务管理)的方法,它...

    阿里云数据管理服务-产品简介.pdf

    1. **简单易用**:无需安装和维护,用户可以快速上手,即使不懂SQL也能轻松管理数据。高效的SQL编辑工具可以显著提高编写效率。 2. **丰富多样**:支持多种数据库和服务器类型,提供统一管理入口。 3. **安全可靠**...

    博客管理系统

    - 数据库类型:MySQL、PostgreSQL、MongoDB等,存储博客文章、用户信息、评论等数据。 - 数据表设计:包括文章表、用户表、评论表等,合理规划字段和关系。 - SQL查询优化:提高数据检索速度,减少数据库负载。 ...

    NoSQL 和云计算的关系

    1. **理解误区**:“NoSQL适用于那些不懂SQL、反规范化或查询优化的人。”同样,有人认为只有特定数据库的用户才会转向NoSQL,因为原有的数据库有缺陷。 2. **历史误区**:“NoSQL并不是什么新事物,因为我们多年前...

    聚合直播盒子H5网页源码

    10. **测试与部署**:在开发过程中,单元测试、集成测试和性能测试都是必不可少的,以确保软件质量。部署时,需要考虑服务器配置、负载均衡、CDN(内容分发网络)的使用,以及持续集成/持续部署(CI/CD)流程的建立...

    精品仿jfylist.com丰胸站单页程序源码

    在IT行业中,源码是构建网站、应用等软件的基础,它是程序员用编程语言编写的指令集合。... 首先,我们需要了解什么是单页应用程序(SPA...对于不懂编程的用户,可能需要找专业的开发人员协助完成网站的搭建和维护工作。

    互联网创业核心技术:构建可伸缩的Web应用(带书签,完整版)

    对于Web应用来说,这意味着随着流量增加,系统能够平滑地处理更多请求,而不是崩溃或者响应变慢。 1. **分布式系统**:构建可伸缩Web应用的第一步通常是采用分布式架构。分布式系统允许应用程序运行在多台机器上,...

    历年程序员真题12-17

    首先,2010年的程序员考试可能涵盖了编程基础,包括但不限于数据结构(如数组、链表、树、图等)、算法(排序、查找)、面向对象编程概念(封装、继承、多态)、设计模式以及常用编程语言(如C++、Java)的基础语法...

    上门预约服务小程序4.7.75前端 (未加密)

    8. **部署环境**:描述中提到“建推荐使用宝塔”,宝塔是一款流行的服务器管理软件,它简化了Web应用的部署和管理,支持一键安装多种环境,对于不懂Linux命令行的开发者非常友好。 9. **性能优化**:为了保证小程序...

    [已测试]拼多多客京东客蘑菇街小程序V10.0.8完整全解密后端源码+小程序前端.rar

    后端可能采用Node.js、Java、Python或其他支持RESTful API的服务器端语言,并结合数据库如MySQL、MongoDB等存储数据。 6. **安全与合规性**:在使用和部署此小程序时,必须确保遵循拼多多、京东和蘑菇街的开放平台...

    三分钟彻底弄懂什么是分布式和微服务架构

    尽管这种方法提高了事务成功率,但仍然存在数据不一致的风险,尤其是在第二阶段发生故障时。因此,避免过度依赖分布式事务以保持系统性能是明智的选择。 服务划分是微服务设计的关键。横向拆分按业务域划分服务,如...

Global site tag (gtag.js) - Google Analytics