MySQL是由Oracle公司开发,发布和支持的受欢迎的开源关系数据库管理系统(RDBMS)。像其余关系系统同样,MySQL将数据存储在表中,并使用结构化查询语言(SQL)来进行数据库访问。在MySQL中,您能够根据须要预先定义数据库模式,并设置规则来管理表中字段之间的关系。在MySQL中,相关信息可能存储在单独的表中,但经过使用关联查询来关联。经过使用这种方式,使得数据重复量被最小化html
MongoDB是由MongoDB,Inc.开发的开源数据库。MongoDB将数据存储在相似JSON的文档中,而且文档中每一个json串结构可能有所不一样。相关信息存储在一块儿,经过MongoDB查询语言进行快速查询访问。 MongoDB使用动态模式,这意味着您能够在不首先定义结构的状况下建立记录,例如字段或其值的类型。您能够经过添加新字段或删除现有记录来更改记录的结构(咱们称之为文档)。该数据模型可让您轻松地表明层次关系,存储数组和其余更复杂的结构。集合中的文档不须要具备相同的一组字段,数据的非规范化是常见的。 MongoDB还设计了高可用性和可扩展性,并提供了即用型复制和自动分片功能。mysql
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':{![]() |
条件查询 | 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,除非能从架构设计上保证事务安全。git
MongoDB的复副集(Master-Slave)配置很是简洁方便,此外,MongoDB能够快速响应的处理单节点故障,自动、安全的完成故障转移。这些特性使得MongoDB能在一个相对不稳定(如云主机)的环境中,保持高可用性。sql
依赖数据库(MySQL)自身的特性,完成数据的扩展是较困难的事,在MySQL中,当一个单达表到5-10GB时会出现明显的性能降级,此时须要经过数据的水平和垂直拆分、库的拆分完成扩展,使用MySQL一般须要借助驱动层或代理层完成这类需求。而MongoDB内建了多种数据分片的特性,能够很好的适应大数据量的需求。mongodb
MongoDB支持二维空间索引,所以能够快速及精确的从指定位置获取数据。数据库
在一些传统RDBMS中,增长一个字段会锁住整个数据库/表,或者在执行一个重负载的请求时会明显形成其它请求的性能降级。一般发生在数据表大于1G的时候(当大于1TB时更甚)。 因MongoDB是文档型数据库,为非结构货的文档增长一个新字段是很快速的操做,而且不会影响到已有数据。另一个好处当业务数据发生变化时,是将不在须要由DBA修改表结构。json
因为性能很高,也适合做为信息基础设施的缓存层。在系统重启以后,搭建的持久化缓存能够避免下层的数据源过载。后端
1)这些数据一般须要作结构化查询,好比join,这时候,关系型数据库就要胜出一筹数组
2)这些数据的规模、增加的速度一般是能够预期的缓存
3)事务性、一致性(mongdodb4.0也开始支持事务了)
4)丰富的锁机制
例如银行或会计系统;传统的关系型数据库目前仍是更适用于须要大量原子性复琐事务的应用程序。
针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库多是更合适的选择
MongdoDB学习教程: https://piaosanlang.gitbooks.io/mongodb/
Mysql 优化十大技巧: http://www.javashuo.com/article/p-ejcnsyae-e.html