MySQL 是一个功能齐全的开源关系数据库管理系统(RDBMS)。它将数据存储在分组到数据库中的表中,使用结构化查询语言(SQL)来访问数据,并使用“SELECT”,“UPDATE”,“INSERT”和“DELETE”等命令来管理它。相关信息可以存储在不同的表中,但JOIN操作的使用允许您关联它,跨各种表执行查询并最小化数据重复的可能性。MySQL几乎兼容所有操作系统,即Windows,Linux,Unix,Apple,FreeBSD等等。它支持各种存储引擎,如InnoDB(它是默认的),Federated,MyISAM,Memory,CSV,Archive,Blackhole和Merge。
简要概念
关系型数据库。
在不同的引擎上有不同 的存储方式。
查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高。
开源数据库的份额在不断增加,mysql的份额页在持续增长。
缺点就是在海量数据处理的时候效率会显著变慢。
MongoDB 是一个流行的开源文档导向数据库。文档创建并存储在BSON文件中,二进制JSON(JavaScript Object Notation)格式,因此所有JS类型的数据都是支持的。MongoDB通常应用于Node.js项目。除此之外,JSON还可以使用人类可读的格式在服务器和Web应用程序之间传输数据。在存储容量和速度方面,它也是一个更好的选择,因为它提供更高的效率和可靠性。MongoDB提供的最大好处之一是使用动态模式,无需预先定义结构,如字段或值类型。这种模型允许分层关系表示,数组存储,以及通过简单地添加或删除字段来更改记录结构的能力。这种NoSQL解决方案具有嵌入,自动分片和板载复制功能,可实现更好的可扩展性和高可用性。
非关系型数据库(nosql ),属于文档型数据库。先解释一下文档的数据库,即可以存放xml、json、bson类型系那个的数据。这些数据具备自述性(self-describing),呈现分层的树状数据结构。数据结构由键值(key=>value)对组成。
存储方式:虚拟内存+持久化。
查询语句:是独特的Mongodb的查询方式。
适合场景:事件的记录,内容管理或者博客平台等等。
架构特点:可以通过副本集,以及分片来实现高可用。
数据处理:数据是存储在硬盘上的,只不过需要经常读取的数据会被加载到内存中,将数据存储在物理内存中,从而达到高速读写。
成熟度与广泛度:新兴数据库,成熟度较低,Nosql数据库中最为接近关系型数据库,比较完善的DB之一,适用人群不断在增长。
优势:
- 快速!在适量级的内存的Mongodb的性能是非常迅速的,它将热数据存储在物理内存中,使得热数据的读写变得十分快,
- 高扩展!
- 自身的Failover机制!
- json的存储格式!
缺点:主要是无事物机制!
具体特点总结如下:
(1)面向集合存储,易于存储对象类型的数据
(2)模式自由
(3)支持动态查询
(4)支持完全索引,包含内部对象B
(5)支持复制和故障恢复
(6)使用高效的二进制数据存储,包括大型对象(如视频等)
(7)自动处理碎片,以支持云计算层次的扩展性
(8)支持 Python,PHP,Ruby,Java,C,C#,Javascript,Perl 及C++语言的驱动程序,社区中也
提供了对 Erlang 及.NET 等平台的驱动程序
(9) 文件存储格式为 BSON(一种 JSON 的扩展)
MongoDB实现增删改查基本命令 mongod: 打开或者新建一个数据库 :mongod --dbpath dir
mongoinport: 导入mongo文件 :mongoinport --db test --collection user --drop --file C:\User\mongodb\document.json
–db 导入到哪个库 –collection 导入到哪个集合 –drop 加上就表示清空原有文档 –file 要导入的文件
mongo: 创建一个新的库 :use dbname 查看所有库 :show dbs 查看当前库所有集合 :show collection
增加: 在名为collectionName的集合中插入一条文档,如果集合不存在,则新建该集合 :db.collectionName.insert(obj)
例子:在student集合中插入文档
db.student.insert({ id:101, name: '张三', sex: '男', address: '广东' })查询: 查找名为collection集合的所有文档 :db.collectionName.find()
查询k的值为v的文档 : db.collectionName.find({k : v})
查询k1的值为v1 且 k2的值为v2的文档 :db.collectionName.find({k1 : v1},{k2 : v2})
查询k1的值为v1 或 k2的值为v2的文档 :db.collectionName.find($or : {k1 : v1},{k2 : v2})
查询k的值大于v的文档,$ gte大于等于(>=) : db.collectionName.find({k : {$gt:v}})
查询k的值小于v的文档,$ lte小于等于(<=) : db.collectionName.find({k : {$lt:v}})
查询前三条数据 :db.collectionName.find().limit(3)
修改: 修改文档
db.collectionName.update( {k1 : v1}, //修改k1的值为v1的文档 { $set:{k2 : v2, k3 : v3}, } )替换文档
db.collectionName.update{ {k1 : v1}, { k2 : v2, k3 : v3 } }删除: 删除当前所在的数据库 :db.dropDatabase()
删除集合 :db.collectionName.drop()
删除匹配到的所有k为v值的文档 :db.collectionName.remove({k : v})
删除第一个匹配到的所有k为v值的文档 :db.collectionName.remove({k : v},{justOne:true})
清空集合 :db.collectionName.remove({})
排序
db.collectionName.find().sort({k1 : 1},{k2 : -1}) 按照k1来排序、如果k1的值相同、按照k2来排序、1代表升序、-1降序
统计条数
db.collectionName.count({k : v})模糊查询 查询有XXX
db.collectionName.find({k : /模糊查询字符串/}) //比如查询名字包含"定"字的人: db.collectionName.find({name:/定/}) 查询以XXX开头
db.collectionName.find({k : /^字符串/}) //比如查询名字以"郑"开头的人: db.collectionName.find({name:/^郑/}) 查询以XXX字结尾
db.collectionName.find({k : /字符串$/}) //比如查询名字以"移"字结尾的人: db.collectionName.find({name:/移$/}) 包含
db.collectionName.find({k : {$in[v1,v2]}}) //比如查询userid字段包含3和4的文档: db.collectionName.find({userid:{$in["3","4"]}}) 不包含
db.collectionName.find({k : {$nin[v1,v2]}}) //查询userid字段不包含2和3的文档: db.collectionName.find({userid:{$nin["2","3"]}})六、Docker安装MongoDB 在宿主机创建 mongo 容器
docker run -id --name=ktc_mongo -p 27017:27017 mongo 远程登陆
mongo 192.168.12.128 MongoDB客户端操作起来未免太过复杂,因此我们采用第三方的可视化工具来帮我们操作MongoDB,就类似于我们使用Navicat来操作MySQL一样
七、MongoDB的可视化工具 1、NoSQLBooster for MongoDB 2、Robo 3T
比较:
数据库 | MongoDB | MySQL |
数据库模型 | 非关系型 | 关系型 |
存储方式 | 以类JSON的文档的格式存储 | 不同引擎有不同的存储方式 |
查询语句 | MongoDB查询方式(类似JavaScript的函数) | SQL语句 |
数据处理方式 | 基于内存,将热数据存放在物理内存中,从而达到高速读写 | 不同引擎有自己的特点 |
成熟度 | 新兴数据库,成熟度较低 | 成熟度高 |
广泛度 | NoSQL数据库中,比较完善且开源,使用人数在不断增长 | 开源数据库,市场份额不断增长 |
事务性 | 仅支持单文档事务操作,弱一致性 | 支持事务操作 |
占用空间 | 占用空间大 | 占用空间小 |
join操作 | MongoDB没有join | MySQL支持join |