mongodb文档数据库

1.什么是文档数据库

满足关系型数据库的一些特性和方式,没有表约束。便于灵活存储海量非固定结构数据。

文档相当于关系数据库中的一条纪录,无固定结构,可以很复杂,可以不满足关系数据库的一些规范约束

2.文档数据库与关系型数据库的区别

1) 关系型数据库中的每条记录存储都需要遵循一个固定的模式,固定的列数,每一列都有特定的意义还规定了数据类型。

2)目前互联网数据量越来越大,数据复杂多样,使用文档型模型保留了数据的原样,不需要创建新的表模式来处理,存储直接快速

3)文档数据库有些没有使用关系数据库的特性,如事务,所以文档数据库在高访问量时能够有更好的并发性。

3.mongodb索引是怎么做的

1)createIndex({field:1}),ensureIndex({field:1})

2)mongo的索引也是基于btree

3)explain查看语句的性能分析(basIcCursor没有用到索引遍历,btreeCursor B树索引),

4)mongoddb的优化程序会对比索引性能(索引查询返回时间,索引扫描的文档数,索引字段扫描数),选取最优索引进行查询

4.mongodb集群分片?复制集?分片有哪几种方式?分片与mysql分库分表的差别?

mongodb复制集就是一组mongodb进程,共同维护一个数据集合,提供数据冗余和高可靠性

主从复制原则,通过仲裁者服务器选举主服务器

分片(sharding)是用来将大型集合分割到不同服务器,分片主要目的是解决单机负载问题提高数据吞吐量和降低单机压力。

基于范围的分片mongodb案件分片键的范围划分 基于hash的分片利用hash索引作为分片的单个键,且hash分片的片键只能使用一个字段,能保证数据在各个节点分布基本均匀

和mysql分区相比,mongodb最大的区别在于它几乎能自动完成所有事情只要告诉mongodb要分配树,它就能自动维护数据在不通服务器之间的均衡,对应用来说透明。mongo自带一个mongos路由进程,掌握统一路口的路由器,将客户端的请求准确无误的路由到集群的机器上,同时拼装响应到客户端。

Config Server

存储集群所有节点、分片数据路由信息。默认需要配置3个Config Server节点。

Mongos

提供对外应用访问,所有操作均通过mongos执行。一般有多个mongos节点。数据迁移和数据自动平衡。

Mongod

存储应用数据记录。一般有多个Mongod节点,达到数据分片目的。

5.mongodb性能优化

1)填充因子为文档的扩展而预留的增长空间,因为mongo的文档是以顺序表的方式存储,文档扩展需要移动元素,预留空间能够减少移动(usePowerOf2Size,padding一些数据)

2)准确利用索引,进行一些索引优化(同mysql索引),将辨识度高的(数据颗粒小)的索引放在前面,减少索引(mongo有对索引选取进行优化)

3)多用exlpain命令查看查询语句的性能,诊断问题

4)选择分片,设置好分片策略,不建议向从节点取数据,从节点拥有与主节点一样的写入负载

5)表设计时,数据可以嵌入一些数据,不一定要满足范式

6.mongodb的查询与mysql查询的差别

1)mongo和mysql查询中都可以使用索引,索引都是有b树等多路搜索树构成

2)mongo的查询有自己的查询语法,mysql使用sql查询

3)mongo支持二维空间索引及全文索引

4)mongo事务关系支持弱

7.mongodb一些特性?

1)面向集合,模式自由,文档型

2)文档是基本单元类似表中的行,多个文档组成一个集合类似表

3)支持分片和复制集,数据自动balance对上层应用透明,扩展能力强

4)支持mapreduce计算模型

8.mongodb的原子操作

mongo对事务支持弱,但提供一些原子操作,来保证数据操作过程中的原子执行

findAndModify,set,unset,inc,push,pushall,pull,pop,addToSet,rename...

9.mongo chunks,balancing

shard server内部,mongodb会把数据分为chunks,每个chunk代表一部分数据,chunk会有两个用途,splitting当一个chunk大小超过配置时,mongo的后台进程会把chunk切分为更小的chunk,避免chunk过大的情况,balancing:mongodb里有个balancer后台进程,负责chunk的迁移,从而均衡各个shard server的负载。

10.mongo磁盘碎片整理

当mongo中删除文档或集合后,mongodb不会将disk空间释放给os,mongodb在数据文件中维护empty records的列表。当重新插入数据后,mongo从empty records表中分配存储空间给新的document,因此,不需要重新开辟空间,为了更新有效的重用disk空间,必须重新整理数据碎片。1.使用compact命令;2.重建collection;3.新加一个secondary节点,然后将此节点切换为primary.

compact命令能够重建和重组集合的data和index(db.runCommand({compact:,force:}))


分享到:


相關文章: