基础篇
认识MongoDB
MongoDB是一个高性能、开源、无模式的文档型数据库
。使用c++
开发。
NoSQL简介
NoSQL(Not Only SQL,非关系型数据库)的主要特点是非关系型的、分布式的、开源的、水平扩展的。
NoSQL的类型有Key-Value
存储、文档型、列存储、图型数据库、XML数据库等。
NoSQL产生背景
关系型数据库在越来越多的应用场景下不那么合适了。
- 对数据库并发读写的需求
- 对海量数据的高效率存储和访问的需求
- 对数据库的高扩展性和高可用性的需求
- 很多web系统对数据库事务一致性的需求很低,数据库事务管理不仅无用武之地,还成了数据库的高负载下的负担。
- 很多应用的数据库的写实时性和读实时性的需求并不是特别高,关系型数据库的实时读写无用武之地。
NoSQL的种类
面向文档的非关系型数据库主要解决的问题
在保证海量存储的同时,提供良好的查询性能。MongoDB主要解决的就是海量数据的访问效率问题。根据官方文档记载,当数据量达到50GB以上时,MongoDB的数据库访问速度是MySQL的10倍以上。
MongoDB不是为了解决高性能的并发读写而出现的,它的并发读写效率并不出色。
MongoDB自带了一个出色的分布式文件系统GridFS,可以支持海量的数据存储。
MongoDB有一个Ruby的项目MongoMapper,是模仿Merb的DataMapper编写的MongoDB接口,使用起来很简单,但是功能很强大。
满足高读写性能的Key-Value数据库
比如:Redis
满足高可扩展性和可用性的面向分布式计算的数据库
比如:Cassandra
NoSQL的特点
- 运行在便宜的服务器集群上。集群扩充方便又廉价。
- 击碎了性能瓶颈,执行速度特别快。
- 没有过多的复杂操作。
认识MongoDB
MongoDB是一个介于关系型数据库和非关系型数据之间的产品,是非关系数据库中功能最丰富、最像关系型数据库的。它支持的数据结构非常松散,是类似JSON和BSON格式,可以存储比较复杂的数据类型。
MongoDB特点及功能
- 面向集合存储(collection-oriented)
- 模式自由(Schema-Free)
{“welcome”:“beijing”}
{“age":25}
这两条记录可以在同一个集合里存在。
- 支持动态查询
- 支持完全索引,包含内部对象
- 支持复制和故障恢复
- 使用高效的二进制数据存储,包括大型对象(如视频)
- 自动处理碎片,以支持云计算层次的扩展性
- 支持Python、PHP、Ruby、Java、C、C++、C#、JavaScript、Perl的驱动程序
- 文件存储类型为BSON(一种JSON的扩展)
- 可以通过网络访问
存储的是键值对的集合,键是字符串,值可以是数据类型集合里的任意类型,包括数组和文档。这个数据格式称为BSON(Binary Serialized Document Notation)
快速入门
体系结构
一个运行着MongoDB的数据库可以看做是一个MongoDB Server,该Server由实例和数据库组成。
一般情况下,一个MongoDB Server机器上包含一个实例和多个与之对应的数据库。
特殊情况下,允许一个Server机器上有多个实例和多个数据库。
数据逻辑结构
- 文档(document)
- 集合(collection)
- 数据库(database)
MongoDB与关系型数据库逻辑结构的对比
数据存储结构
- MongoDB的默认数据存储目录中存储着MongoDB的数据文件。
- MongoDB内部有预分配空间的机制,以减少碎片。
- 数据库的每张表都对应一个命名空间。
日志系统
- 系统日志
- oplog主从日志
- Journal日志
- 慢查询日志
元数据存储
元数据是预留空间
- system.namespaces
- system.indexs
- system.profile
- system.users
- system.sources
数据类型
高级篇
高级查询
查询操作符
- 条件操作符:< <= > >=
- all匹配所有
- exists判断字段是否存在
- null值处理
- mod取模运算
- ne不等于
- in包含
- nin不包含
- size匹配数组元素个数
- count
- skip
- sort
- distinct
- group
高级更新
- inc
- set
- unset
- push
- pushAll
- addToSet
- pop
- pull
- pullAll
- rename
高级特性
- Capped collection:性能出色,有着固定大小的集合。
- GridFS规范
- MongoDB的BSON对象大小是有限制的。
- mongofiles工具
- MapReduce模型:MongoDB的MapReduce相当于MySQL的group by
管理篇
管理工具
- 导出工具mongoexport
- 导出工具mongodump
- 导入工具mongoimport
- 备份工具mongodump
- 恢复工具mongorestore
- eval参数执行指定语句
- 执行指定文件中的内容
- 远程克隆collection
- 本地克隆collection
- 复制数据库db.copyDatabase
- 远程复制数据库
- 本地复制数据库
- 刷新磁盘db.runCommand({fsync:1})
- 捕获异常db.getLastError
- 查看进程db.currentOp()
- 结束进程db.killOp()
- 验证collection的有效性db.tablename.validate()
- 数据压缩db.table.repairDatabase()
性能篇
- 创建索引db.table.ensureIndex()
- 索引优化
- 性能监控
架构篇
- 复制集Replica Sets架构
- 分片sharding,构建分布式MongoDB集群