**
1. mongoDB适用场景
**
- 存储的数据为json格式
- 实时的DML操作(可以理解为因为使用缓存的缘故)
- 大数据量的存储
- 应用后续需要水平扩展
- 数据模型不确定(可以理解为mongo对collection的结构不固定,这里collection的概念对应关系型数据库中的表概念)
2.mongoDB为什么效率比Mysql高?
采用基于内存映射的存储引擎。这里肯定对内存映射是什么很疑惑,一开始我也这样。
内存映射简述:正常的对数据库进行查询数据,需要对数据进行两次复制,第一次复制,将数据从磁盘中拷贝到内核空间中(主要是内核中的Page Cache,用户不能直接寻址),第二次复制,将内核空间的数据拷贝到用户空间中。而内存映射的作用就是为了跳过内核空间这一步的复制过程。它将数据所在的磁盘地址映射到用户空间中的虚拟地址中。这里可以理解为它建立了用户空间和磁盘之间的桥梁,加快了对磁盘数据的访问。
mongodb对数据的持久化,都是先暂存在内存中,一段时间后再写入磁盘。加快了读写效率。
3.mongoDB集群
-
副本集
如果学过redis集群,就类似哨兵模式,Primary负责读写数据,并将这些操作写入oplog,Secondary不断从Primary获取这个oplog,并将这些操作在自己存储的数据中实现一遍。达到一个备份目的。当Primary宕机,Secondary转Primary。默认情况Primary负责所有的读写,但是可以设置从Secondary读取数据,达到读写分离的目的。 -
分片(Shading)
这个集群其实就是把一个collection砍成一段段的,均匀的布置到多个mongodb中,达到数据拆分到多个数据库中。有几个概念要了解一下
mongos:路由,集群抽象化,提供统一入口,集群对外不可见
configserver:配置信息存储
shard:真正存储数据的地方
chunk(块):一个collection拆分变成块
分块规则:
1.范围分块
根据分片键的值的范围进行分块,这个分片键就是colleciton中的一个索引字段。
优点:相连数据可能存在一个块中或相邻块中,范围性的查询就来的比较便利了。
缺点:对一部分数据的查询,可能都集中在一个块上,如果是热点数据,会给单个shard带来压力。
2.Hash分块
通过计算各个分片键hash值将数据拆分。
优点:相邻数据可能不在一个块上,达到真正的数据随机均匀分布
缺点:范围查询效率相对较低,可能要查询所有的shard才能得出结果。
暂时先写这么多,如果有错误,望告知,谢谢!