`

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,往字典里插一个数据,或者拿一个数据。

 

要想高性能,善用那个_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而言,很正常。

 

原文:http://www.cnblogs.com/crazylights/archive/2013/05/08/3066056.html

分享到:
评论

相关推荐

    spring-data使用mongodbTemplate对MongoDB进行读写操作

    这个库是Spring Data框架的一部分,旨在简化数据访问层的实现,尤其在使用NoSQL数据库如MongoDB时。MongoDBTemplate是Spring Data MongoDB的核心组件,它提供了丰富的API来执行常见的数据库操作。 首先,让我们深入...

    MongoDB实验 - .docx

    本实验报告旨在详细介绍 MongoDB 的安装、配置和基本操作步骤,本报告基于 CentOS 7 系统,通过一步一步的截图和文字说明,帮助读者快速掌握 MongoDB 的使用。 一、安装 MongoDB 首先,我们需要配置 MongoDB 的 ...

    linux安装mongodb教程

    使用 Windows XP 的 cmd 工具,执行以下命令测试 MongoDB 是否已经成功安装: telnet 服务器 IP 27017 如果配置成功,telnet 命令将返回成功信息。 知识点 8:重启服务器 重启服务器,测试 MongoDB 是否已经自...

    mongodb-测试数据

    在使用这些测试数据时,你应该逐一实践每个操作,对比预期结果,理解MongoDB的工作原理。同时,你也可以利用这些数据进行性能调优,找出最佳实践。记住,实践是掌握任何技术的关键,尤其是像MongoDB这样的数据库管理...

    如何安装MongoDB 如何使用MongoDB

    本课程是一套关于MongoDB应用开发的实战性教程,名为《深入浅出MongoDB应用实战开发(基础、开发指南、系统管理、集群及系统架构)》,教程侧重于讲解MongoDB的常用特性及高级特性,从实际开发的角度出发对MongoDB...

    windows下mongodb安装与使用整理

    ### Windows 下 MongoDB 安装与使用详解 #### 一、MongoDB 简介 MongoDB 是一种基于分布式文件存储的开源数据库系统。它属于 NoSQL 数据库的一种,使用 BSON(Binary JSON)格式来存储数据,支持动态模式,使得开发...

    geoserver发布mongodb矢量数据地图服务.docx

    本文将介绍如何使用Geoserver将MongoDB矢量数据发布为地图服务。 一、Geoserver概述 Geoserver是基于Java开发的一款开源GIS服务器,能够处理大量的空间数据,提供了强大的空间数据存储、处理和发布功能。Geoserver...

    mongodb Windows7 64位

    打开命令提示符,以管理员身份运行,执行`mongod --config "C:\Program Files\MongoDB\Server\<version>\bin\mongod.cfg" --service install`来安装服务,然后用`net start MongoDB`启动服务。 3. **连接MongoDB** ...

    Centos7下安装MongoDB

    2. 安装MongoDB:使用yum install mongodb-org命令安装MongoDB。 3. 创建数据目录:创建/data/mongodb/data和/data/mongodb/log目录,并修改目录权限。 4. 修改配置文件:修改mongod.conf文件,包括systemLog、...

    mongodb数据库jar包

    在Java应用程序中,为了与MongoDB进行交互,我们需要使用Java MongoDB驱动程序。这个压缩包包含的就是Java连接MongoDB所需的驱动jar包,确保了开发者能够通过编程方式连接到MongoDB数据库并执行各种操作。 首先,让...

    mongodb.dll 下载.zip

    正确理解和使用`mongodb.dll`和相应的MongoDB驱动程序是开发和维护MongoDB应用程序的基础。确保你始终使用与MongoDB服务器版本兼容的驱动,以保证最佳的性能和稳定性。在进行任何系统更改前,建议先备份重要数据,...

    MongoDB入门指南.pdf

    1. 高性能:MongoDB使用了高性能的存储引擎,可以快速地存储和检索数据。 2. 高可用:MongoDB支持高可用性,可以自动地将数据复制到多个节点上,从而确保数据的安全。 3. 可扩展:MongoDB支持水平扩展,可以根据需要...

    mongodb c#驱动最新驱动mongodb.driver.dll 版本2.12.0-beta1

    开发者在升级到此版本时,需要注意其预发布(beta)状态,这意味着可能存在不稳定因素,建议在生产环境使用前充分测试。 MongoDB.Bson.dll 文件是 Bson(Binary JSON)的实现,Bson 是一种二进制形式的 JSON,它...

    Linux安装mongodb客户端

    sudo vim /etc/yum.repos.d/mongodb-org-4.2.repo 写入: [mongodb-org-4.2] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/ gpgcheck=1 enabled=1 gpg...

    MongoDB图形化管理工具 MongoDB Compass

    MongoDB图形化管理工具 MongoDB Compass

    java中mongodb使用环境详细配置

    Java 中 MongoDB 使用环境详细配置 Java 中 MongoDB 使用环境详细配置是指在 Windows 平台(WinXP)上安装、运行、安装 Windows 服务的笔记,以作备忘。下面是一些重要的知识点: 1. MongoDB 的下载和安装 ...

    在linux下配置 和启动mongodb

    例如,可以使用以下命令下载 MongoDB 1.6.3 版本: ``` curl -O http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-1.6.3.tgz ``` 这将下载 MongoDB 1.6.3 版本的安装包。 第三步:解压缩文件 下载完成后,...

    Thinkphp使用mongodb数据库实现多条件查询方法

    在Thinkphp中使用MongoDB进行多条件查询时,需要对框架提供的驱动进行一定的修改以适应MongoDB的查询方式。 在Thinkphp中实现多条件查询时,可以使用框架提供的查询构建器(Query Builder),但是当涉及到MongoDB的...

    mongodb7.0.0安装包

    使用“mongod.exe” --install命令,然后用“net start MongoDB”启动服务。 8. 安全性:默认情况下,MongoDB不开启任何安全措施。为了生产环境的安全,你应该设置访问控制,如添加用户、启用身份验证以及配置网络...

Global site tag (gtag.js) - Google Analytics