Mongodb学习总结(2)——MongoDB与MySQL区别及其使用场景对比
对于只有SQL背景的人来说,想要深入研究NoSQL似乎是一个艰巨的任务,MySQL与MongoDB都是开源常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL数据库。它们各有优点,关键看用在什么地方。
什么情况下,MongoDB是最好的选择?
很多人认为MongoDB难以置信的强大,是一个可扩展,界面交互友好的数据库解决方案。当开发人员需要负责管理数据库环境时,MongoDB是一个不错的选择。起码在小型企业和初创公司,是这样。MongoDB将信息存储在BSON(二进制JSON)中。BSON是一种类JSON二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文档对象和数组对象,但BSON有JSON没有的一些数据类型,如Date和BinData类型。JSON很容易与其他编程语言关联,许多开发人员都有使用JSON的经验。
当你的程序有大量流量写入时,MongoDB也是一个很好的选择。这并不是说MySQL在处理频繁写入环境方面不是一个好的选择,只是说MongoDB相对更容易一些。Facebook为写负载过重的环境设计了RocksDB存储引擎,性能还不错(通过基准测试证明了这一点)。
当你需要一个无模式或模式灵活的数据结构时,MongoDB是一个不错的选择。MongoDB对数据结构的更改相对轻松和宽容,这是NoSQL解决方案的卖点。在MySQL世界中有许多改进使在线模式更改成为可能,只创建记录而不定义结构增加了MongoDB的灵活性。
选择MongoDB的另一个原因是它具有设置复制环境,内置分片和自动选择方面的功能。在MongoDB中设置复制环境很容易,自动选择过程允许从数据库在主数据库故障的情况下接管。内置分片允许简单的横向扩展。在MySQL环境中管理,设置和配置会很复杂。
什么情况下不能选MongoDB?
对某些用例而言,MongoDB是不错的选择,但它也不是万能的。当数据高度关系化和结构化时,MongoDB就不是最佳选择。MongoDB不支持事务,但在文档级别,具有原子性。对于复制环境,有关写入问题的配置注意事项都是以牺牲性能为代价的。写入方面将验证副本是否已写入信息,默认情况下,MongoDB将写请求设置为仅从主计算机请求确认,而不是副本。因为如果副本有问题,就会导致一致性问题。
二者结构有何不同?
SQL中的许多概念都与MongoDB的文档结构相关。让我们来看一个简单的MongoDB环境结构,以更好地了解MongoDB的布局。
下面的图表涉及MySQL与MongoDB的不同点:
除此之外,另一个有趣的地方是mongod进程。这是一个处理数据请求的守护进程,与MySQL的mysqld进程大致相同,是监听MongoDB请求并管理数据库访问的进程。和MySQL一样,mongod进程有很多启动选项。最重要的配置选项之一是config,它是专门用于mongod实例的配置文件。与MySQL稍有不同,此文件使用YAML格式。下面是MongoDB配置文件示例。请注意,这是演示格式化,它并未针对任何生产数据库进行优化。
根据定义,MongoDB是一个基于分布式文件存储的数据库。可以立即将文档插入到集合中,而无需创建表和添加数据,无需定义结构。这是MongoDB与MySQL相比的优点之一,更加灵活。要注意,MongoDB提供的这种灵活性并不意味着组织一个功能强大的MongoDB数据库毫不费力。选择任何数据库,都应该考虑数据库的结构和目标。
# mongod.conf, Percona Server for MongoDB
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
engine: rocksdb
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
processManagement:
fork: true
pidFilePath: /var/run/mongod.pid
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1
注意:YAML格式化不处理选项卡,使用空格缩进。
查询方式有何不同?
通过shell与数据库交互与SQL略有不同,以下是从SQL翻译为MongoDB的查询示例,其中使用了一个只有用户名和相关ID的用户表。
In SQL:
select username from user where id = 2;
In MongoDB:
db.user.find({_id:2},{“username”:1})
在JSON格式中,我们指定要查询的用户集合,然后指定与我们感兴趣的文档相关联的ID。最后,指定从中获取值的字段,此查询结果将是ID为2的用户的用户名。
总结
MongoDB不是MySQL的影子,也不是MySQL的替代品,随着两个数据库的不断发展,它们的优劣慢慢融合在一起。MySQL用户可以在MongoDB上测试各种实例,但不鼓励盲目追求MongoDB的灵活性。尽管MongoDB在电子商务和游戏世界是一个受欢迎的选择,因为它能够利用大量数据进行水平扩展。
Mongodb学习总结(2)——MongoDB与MySQL区别及其使用场景对比的更多相关文章
- Mongodb学习笔记一(Mongodb环境配置)
Mongodb学习 说明: MongoDB由databases组成,database由collections组成,collection由documents组成,document由fileds组成.Mo ...
- MySQL和Mongodb的区别与应用场景对比
MySQL是关系型数据库 优势: 在不同的引擎上有不同 的存储方式. 查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高. 开源数据库的份额在不断增加,mysql的份额页在持续增长. 缺点 ...
- MongoDB学习笔记一(MongoDB介绍 + 基本指令 + 查询语句)
什么是MongoDB MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为WEB应用提供可扩 ...
- MongoDb 学习笔记(一) --- MongoDb 数据库介绍、安装、使用
1.数据库和文件的主要区别 . 数据库有数据库表.行和列的概念,让我们存储操作数据更方便 . 数据库提供了非常方便的接口,可以让 nodejs.php java .net 很方便的实现增加修改删除功能 ...
- MongoDB学习笔记(一) MongoDB介绍及安装(摘)
MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种.它在许多场景下可用于替代传统的关系型数据库或键/值存储方式.Mongo使用C++开发.Mongo的官方网 ...
- Mongodb学习笔记二(Mongodb基本命令)
第二章 基本命令 一.Mongodb命令 说明:Mongodb命令是区分大小写的,使用的命名规则是驼峰命名法. 对于database和collection无需主动创建,在插入数据时,如果databas ...
- MongoDB学习-->Spring Data Mongodb框架之Repository
application-dev.yml server: port: 8888 mongo: host: localhost port: 27017 timeout: 60000 db: mamabik ...
- MongoDB学习笔记-认识MongoDB
学习参考地址 http://www.runoob.com/mongodb NoSql 流行的数据库Oracle,SqlServer,MySql为关系性数据库,相对的,也有非关系性数据库,统称为NoSq ...
- MongoDB学习笔记(一) MongoDB介绍及安装
转自:http://database.51cto.com/art/201103/247882.htm http://baike.baidu.com/link?url=b6B3dVSCnQauCX-Ep ...
随机推荐
- 《Effective C++》笔记:III(转载)
转自:http://www.cnblogs.com/destino74/p/3960802.html 条款5:Know what functions C++ silently writes and c ...
- bzoj 1671: [Usaco2005 Dec]Knights of Ni 骑士【bfs】
bfs预处理出每个点s和t的距离d1和d2(无法到达标为inf),然后在若干灌木丛格子(x,y)里取min(d1[x][y]+d2[x][y]) /* 0:贝茜可以通过的空地 1:由于各种原因而不可通 ...
- python程序展现图片遇到的坑
使用cv2展示图片的时候遇到了问题,提示:TypeError: Required argument 'mat' (pos 2) not found 给定的图片路径是没得问题的,代码如下: 使用open ...
- [转]从数据到代码——基于T4的代码生成方式
本文转自:http://www.cnblogs.com/artech/archive/2010/10/23/1859529.html 在之前写一篇文章<从数据到代码>(上篇.下篇)中,我通 ...
- sed -i 报错的情况
是因为替换的变量中带/的目录名 将原来的/改成#
- 【转】jvm内存结构
JVM的基本结构 包括四部分:类加载器.执行引擎.内存区(运行时数据区).本地方法接口 类加载器:jvm启动时或类运行时将需要的class文件加载到JVM中. JVM内存申请过程如下: JVM 会试图 ...
- Thread stack overrun
ERROR 1436 (HY000): Thread stack overrun: 6448 bytes used of a 131072 byte stac k, and 128000 bytes ...
- 第一节:重写(new)、覆写(overwrite)、和重载(overload)
一丶重写<NEW> 子类重写父类方法,方法里加new, eg: public new void CommonMethord1(string msg){} 子类继承父类中的普通方法,如果在子 ...
- .net core 中简单封装Dapper.Extensions 并使用sqlsuger自动生成实体类
引言 由公司需要使用dapper 同时支持多数据库 又需要支持实体类 又需要支持sql 还需要支持事务 所以采用了 dapper + dapperExtensions 并配套 生成实体类小工具的方 ...
- 关于MD5解密网站。www.cmd5.com
第一次听说这个网站,本人的名字居然也能够被解密,而且还是需要付费取得明文! 大家知道,md5加密是我们常用的加密方式,这个加密方式的好处在于不可逆.而且任何环境下算出的密文应该都是相同的,所以在大家登 ...