mongodb 16问(mongodb sample)

1.什么是文档数据库

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

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

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

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

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

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

3.mongodb索引是怎么做的

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

2)mongo的索引也是基于btree(b-tree)

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

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

5)每个索引至少需要数据空间为8kb;

6)索引名称长度不能超过128字段;

7)复合索引不能超过32个属性;

8)每个集合Collection不能超过64个索引;

9)不同类型索引还具有各自的限制条件。

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:}))

11.为什么 MongoDB 索引选择B-树,而 MySQL 选择B+树

MongoDB使用B-树,所有节点都有Data域,只要找到指定索引就可以进行访问,无疑单次查询平均快于Mysql。

Mysql作为一个关系型数据库,数据的关联性是非常强的,区间访问是常见的一种情况,B+树由于数据全部存储在叶子节点,并且通过指针串在一起,这样就很容易的进行区间遍历甚至全部遍历。

12.mogodb命名空间

MongoDB内部有预分配空间的机制,每个预分配的文件都用0进行填充。

数据文件每新分配一次,它的大小都是上一个数据文件大小的2倍,每个数据文件最大2G。

MongoDB每个集合和每个索引都对应一个命名空间,这些命名空间的元数据集中在16M的*.ns文件中,平均每个命名占用约 628 字节,也即整个数据库的命名空间的上限约为24000。

如果每个集合有一个索引(比如默认的_id索引),那么最多可以创建12000个集合。如果索引数更多,则可创建的集合数就更少了。同时,如果集合数太多,一些操作也会变慢。

要建立更多的集合的话,MongoDB 也是支持的,只需要在启动时加上“–nssize”参数,这样对应数据库的命名空间文件就可以变得更大以便保存更多的命名。这个命名空间文件(.ns文件)最大可以为 2G。

每个命名空间对应的盘区不一定是连续的。与数据文件增长相同,每个命名空间对应的盘区大小都是随分配次数不断增长的。目的是为了平衡命名空间浪费的空间与保持一个命名空间数据的连续性。

需要注意的一个命名空间$freelist,这个命名空间用于记录不再使用的盘区(被删除的Collection或索引)。每当命名空间需要分配新盘区时,会先查看$freelist是否有大小合适的盘区可以使用,如果有就回收空闲的磁盘空间。

13."ObjectID"有哪些部分组成

一共有四部分组成:时间戳、客户端ID、客户进程ID、三个字节的增量计数器

_id是一个 12 字节长的十六进制数,它保证了每一个文档的唯一性。在插入文档时,需要提供_id。如果你不提供,那么 MongoDB 就会为每一文档提供一个唯一的 id。_id的头 4 个字节代表的是当前的时间戳,接着的后 3 个字节表示的是机器 id 号,接着的 2 个字节表示 MongoDB 服务器进程 id,最后的 3 个字节代表递增值。

14.如何理解MongoDB中的GridFS机制,MongoDB为何使用GridFS来存储文件

GridFS是一种将大型文件存储在MongoDB中的文件规范。使用GridFS可以将大文件分隔成多个小文档存放,这样我们能够有效的保存大文档,而且解决了BSON对象有限制的问题。

15.更新操作会立刻fsync到磁盘吗

??不会,磁盘写操作默认是延迟执行的.写操作可能在两三秒(默认在60秒内)后到达磁盘,通过 syncPeriodSecs 启动参数,可以进行配置.例如,如果一秒内数据库收到一千个对一个对象递增的操作,仅刷新磁盘一次.

16.数据在什么时候才会扩展到多个分片(Shard)里

?MongoDB 分片是基于区域(range)的。所以一个集合(collection)中的所有的对象都被存放到一个块(chunk)中,默认块的大小是 64Mb。当数据容量超过64 Mb,才有可能实施一个迁移,只有当存在不止一个块的时候,才会有多个分片获取数据的选项。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注