MongoDB 与 Mysql 的对比
什么是Mysql (详细连接)
MySQL是由Oracle公司开发,发布和支持的受欢迎的开源关系数据库管理系统(RDBMS)。像其他关系系统一样,MySQL将数据存储在表中,并使用结构化查询语言(SQL)来进行数据库访问。在MySQL中,您可以根据需要预先定义数据库模式,并设置规则来管理表中字段之间的关系。在MySQL中,相关信息可能存储在单独的表中,但通过使用关联查询来关联。通过使用这种方式,使得数据重复量被最小化
什么是MongoDB (详细连接)
MongoDB是由MongoDB,Inc.开发的开源数据库。MongoDB将数据存储在类似JSON的文档中,并且文档中每个json串结构可能有所不同。相关信息存储在一起,通过MongoDB查询语言进行快速查询访问。 MongoDB使用动态模式,这意味着您可以在不首先定义结构的情况下创建记录,例如字段或其值的类型。您可以通过添加新字段或删除现有记录来更改记录的结构(我们称之为文档)。该数据模型可以让您轻松地代表层次关系,存储数组和其他更复杂的结构。集合中的文档不需要具有相同的一组字段,数据的非规范化是常见的。 MongoDB还设计了高可用性和可扩展性,并提供了即用型复制和自动分片功能。
术语和概念
MySQL | MongoDB |
---|---|
表 table | 集合 collection |
行 row | 文档 document |
列 column | 字段 field |
表连接 joins | 嵌入文档或者链接 |
语法对比
说明 | MySQL | MongoDB |
---|---|---|
显示库列表 | show databases | show dbs |
使用库 | use mydb1; | use mydb1 |
显示表列表 | Show tables | Show collections |
创建表 | Create table users(age int, sex int) | db.people.insert({"name":"紫龙神","age",18}) ps:可隐式创建表 |
创建索引 | Create INDEX idxname ON users(name) | db.people.ensureIndex({name:1}) |
插入记录 | Insert into users values(1, 1) | db.people.insert({"name":"紫龙神","age",18}) |
查询表 | Select * from users | db.peple.find({"age":18}) |
查询表 | Select * from users | db.people.find() |
条件查询 | Select * from users where age=33 | db.people.find({age:33}) |
条件查询 | select * from users where age<33 | db.people.find({'age':{$lt:33}}) |
条件查询 | select * from users where age>33 and age<=40 | db.people.find({'age':{lte:40}}) |
条件查询 | select * from users where a=1 and b='q' | db.people.find({a:1,b:'q'}) |
条件查询 | select * from users where a=1 or b=2 | db.people.find( { $or:[ { a:1 } , { b:2 } ] } ) |
条件查询 | select * from users limit 1 | db.people.findOne() |
模糊查询 | select * from users where name like "%Joe%" | db.people.find({name:/Joe/}) |
模糊查询 | select * from users where name like "Joe%" | db.people.find({name:/^Joe/}) |
获取表记录数 | select count(1) from users | db.people.count() |
获取表记录数 | bug select count(1) from users where age>30 | db.people.find({age: {$g':30}}.count() |
去掉重复值 | select DISTINCT last_name from users | db.people.distinct('last_name') |
排序(正序) | select * from users ORDER BY name db.people.find().sort({name:1}) | |
排序 (倒序) | select * from users ORDER BY name DESC | db.people.find().sort({name:-1}) |
更新记录 | update users set a=1 where b='q' | db.people.update({b:'q'}, {$set:{a:1}}, false, true) |
更新记录 | update users set a=a+2 where b='q' | db.people.update({b:'q'}, {$inc:{a:2}}, false, true) |
删除记录 | delete from users where z="abc" | db.people.remove({z:'abc'});db. people.remove() 删除所有的记录 |
删除数据库 | drop database IF EXISTS test | use test; db.dropDatabase() |
删除表/collection | drop table IF EXISTS test | db.mytable.drop() |
应用场景对比
MongoDB:
更高的写入负载
默认情况下,MongoDB更侧重高数据写入性能,而非事务安全,MongoDB很适合业务系统中有大量“低价值”数据的场景。但是应当避免在高事务安全性的系统中使用MongoDB,除非能从架构设计上保证事务安全。
高可用性
MongoDB的复副集(Master-Slave)配置非常简洁方便,此外,MongoDB可以快速响应的处理单节点故障,自动、安全的完成故障转移。这些特性使得MongoDB能在一个相对不稳定(如云主机)的环境中,保持高可用性。
数据量很大或者未来会变得很大
依赖数据库(MySQL)自身的特性,完成数据的扩展是较困难的事,在MySQL中,当一个单达表到5-10GB时会出现明显的性能降级,此时需要通过数据的水平和垂直拆分、库的拆分完成扩展,使用MySQL通常需要借助驱动层或代理层完成这类需求。而MongoDB内建了多种数据分片的特性,可以很好的适应大数据量的需求。
基于位置的数据查询
MongoDB支持二维空间索引,因此可以快速及精确的从指定位置获取数据。
表结构不明确,且数据在不断变大
在一些传统RDBMS中,增加一个字段会锁住整个数据库/表,或者在执行一个重负载的请求时会明显造成其它请求的性能降级。通常发生在数据表大于1G的时候(当大于1TB时更甚)。 因MongoDB是文档型数据库,为非结构货的文档增加一个新字段是很快速的操作,并且不会影响到已有数据。另外一个好处当业务数据发生变化时,是将不在需要由DBA修改表结构。
缓存
由于性能很高,也适合作为信息基础设施的缓存层。在系统重启之后,搭建的持久化缓存可以避免下层的数据源过载。
Mongodb 应用案例
- 京东,中国著名电商,使用MongoDB存储商品信息,支持比价和关注功能.
- 赶集网,中国著名分类信息网站,使用MongoDB记录pv浏览计数
- 奇虎360,著名病毒软件防护和移动应用平台,使用MongoBD支撑的HULK平台每天接受200亿次的查询.
- 百度云,使用MongoDB管理百度云盘中500亿条关于文件源信息的记录.
- CERN,著名的粒子物理研究所,欧洲核子研究中心大型强子对撞机的数据使用MongoDB
- 纽约时报,领先的在线新闻门户网站之一,使用MongoDB
- sourceforge.net,资源网站查找,创建和发布开源软件免费,使用MongoDB的后端存储
Mysql:
1)这些数据通常需要做结构化查询,比如join,这时候,关系型数据库就要胜出一筹
2)这些数据的规模、增长的速度通常是可以预期的
3)事务性、一致性(mongdodb4.0也开始支持事务了)
4)丰富的锁机制
Mysql应用案例
高度事物性的系统
例如银行或会计系统;传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。
传统的商业智能应用
针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择
推荐阅读:
MongdoDB学习教程: https://piaosanlang.gitbooks.io/mongodb/
Mysql 优化十大技巧: https://www.cnblogs.com/sharpest/p/10390035.html