MongDB 初学常见问题--认识芒果数据库

10.1.1 芒果数据库是个什么样的数据库?
答: 芒果数据库是一个面向文档的数据库管理系统。和MySQL数据库类似,不过他的数据模型由JSON风格的对象构成,区别于关系数据库中的表。更需要注意的是,芒果数据库既不支持连接(Join)查询也不支持事务(Transtraction)操作。但是芒果数据库支持二级索引,拥有表达能力丰富的查询语言,在文档级别能够保证写操作的原子性,以及完全意义上保证读写一致性
芒果数据库拥有主从结构的特性,可以自动灾备复制。芒果数据库内置了基于范围自动分区的水平扩展的能力

10.1.2 芒果数据库有表的概念吗?
答: 没有。但是有和可以和关系数据库中表类比的概念-集合(collections),芒果数据库所有的数据都存放在集合里,一个集合里存放一个或者多个文档(document),对应关系数据库表中的一行记录(record)。每一个文档由一个或者多个字段(field)组成,这个对应关系数据库表的列名(column)
当然,仅仅是类比而已,面向文档的集合和和关系数据库的表还是有很重要的区别的。在一个集合中的文档一般有一个唯一的组合和字段集。文档没有必要拥有相同的字段。你可以在某个集合里的某些文档上加上新的字段而没必要在集合里的所有的文档上加上这个新的字段

10.1.3 芒果数据库有模式的概念吗?
答: 有,不过芒果数据库的模式是动态的。你可以先创建一个集合而不用先定义他的结构,比如字段,数据类型等都不用先定义,这一点关系数据库表无法做的。在文档里你可以很容易的通过删除一个字段或者添加一个字段来改变文档结构。集合中的文档没有必要拥有相同的字段集(关系数据库表中的所有记录的结构都必须是一样的)
不过在实际操作中,集合中的文档一般拥有几乎相同的数据结构,但这并不是必须的。芒果数据库灵活的模式意味着模式迁移与扩展在实际操作中是件很容易的事情。而曾经的关系数据库中,你需要写‘alert table’这样的语句,现在你可以使用芒果数据库来开发程序以简化这样简单又重复的工作

10.1.4 可以用什么开发语言和芒果数据库交互?
答: 很多,芒果数据库官方网站提供了很多语言的数据库驱动程序 JavaScript,Python,Ruby,PHP,Perl,Java,Scala,C#,C,C++,Haskell,Erlang等等

10.1.5 芒果数据库支持SQL吗?
答: 不支持,但是芒果数据库同样拥有强大丰富的查询语言

10.1.6 芒果数据库主要的用途有哪些或者说有哪些用例?
答: 芒果数据库本身的设计理念就是通常意义上的,很普通的。所以它适用于很多应用场景。举例,比如内容管理系统,移动应用程序,日志,电子商务,归档系统等
对于哪些需要SQL的系统来说,不要使用芒果数据库,这样的系统一般要Join查询,事务操作等,芒果数据库不能胜任

10.1.7 芒果数据库支持ACID事务操作吗?
答: 不支持,不支持多文档事物。
但是,对于单个文档的操作,芒果数据库能够保证原子性。对芒果数据库处理的场景来说,这种文档级别的原子性操作已经足够解决关系型数据库需要通过ACID事务才能解决的问题了
举个例子,在芒果数据库中你可以把相关数据内嵌在文档内置的数组里或者内置的子文档里,这样所有的数据仍然都在一个文档里,可以使用一个原子操作就可以更新整个实体,而关系型数据库,这样的数据要么存在多个表里,要么存在一个表里的多条记录里,不可能一个原子操作全部更新,必须要ACID这样的事务才能保证原子性(性能差别就很明显了,不是吗)

10.1. 8 芒果数据库需要很多内存吗?
答: 表面上看是的,但也不是必须的。首先,事实上,运行芒果数据库本身只需要少量的空闲内存就够了。
芒果数据库会自动的将机器上所有空闲的内存当作自己的缓存,系统资源监视器显示,芒果数据库使用了大量的内存,但是这种用法是动态的。如果另一个程序突然需要使用一半的服务器内存,那么芒果数据库就会立即让出内存给那个程序
从技术上看,操作系统虚拟内存子系统管理着芒果数据库的内存。这就意味着,它会尽可能多大使用空闲内存。需要的话(内存吃紧的话),让出内存,把数据交换到磁盘上。当然有足够的内存的话,应用程序的性能会达到最佳

10.1.9 我要怎么配置芒果数据库缓存的大小?
答: 芒果数据库没有可配置的缓存。它使用内存映射文件尽可能多的使用空闲的内存(这就是它的缓存策略)。操作系统本身就是也用这个策略来处理操作系统的文件系统缓存的

10.1.10 芒果数据库和应用程序之间是否需要设计缓存?
答: 关系型数据库通常会这么干!芒果数据库完全没必要。在芒果数据库中,文档(document)在集合(collections)中的表现形式其实和应用程序层的内存缓存是很相似的(或者你可以这么理解,你所看到的文档,其实大多数情况都是在内存里的,你查询文档的时候,大部分情况,芒果数据库本身就是从内存里取数的,所以基于芒果数据库的应用程序没必要设计数据库缓存)
还有一个特点是,芒果数据库里面存储是文档是BSON格式的,不管是持久化到文件还是缓存在内存里,他的表现形式都是一样的,也就是说从文件加载到内存,芒果数据库里的文档没有必要做任何转换工作,但是关系数据库就不行,基于关系数据库的缓存,必须将数据库的数据读取出来,比如java,则需将其转换成JavaBean,然后才能存放到内存,而且SQL无法直接检索内存,芒果数据库因为存储形式是一致的,即时文档在内存里,也仍然能够用它提供的API直接检索
综上所述,芒果数据库本身就有良好的缓存设计,基于芒果数据库的应用程序完全没有必要再设计数据库缓存

10.1.11 芒果数据库操作缓存吗?或者说芒果数据库从缓存查询数据吗?
答: 当然会的,芒果数据库将最近所使用的数据都保留在内存里。如果你为你的查询设计了索引,并且你索要查询的数据正好都在缓存里,芒果数据库将直接从缓存里获取数据,作为你查询的响应。
芒果数据库并没有实现查询缓存,你当前查询的结果不会在内存里存放一遍,芒果数据库直接从索引和数据文件里开始查询

10.1.12 写操作是实时写入还是延迟写入?
答: 默认情况下,所有的写操作都会在100毫秒内物理写入审计日志里。这个时候,在pull-plug-from-wall事件之后,写操作就被认为是持久的了。即时是硬重启,数据也是可恢复的
虽然,日志提交是瞬间的,但是芒果数据库将数据写入到数据文件确实延迟的。默认情况下,芒果数据库将等待几乎一分钟来将数据写入数据文件。但是这个不影响持久化,因为日志里面拥有足够的信息来保证灾难恢复。当然你还可以改变这些写入数据的时间间隔参数

10.1.13 芒果数据库本身使用什么语言开发的?
答: C++,但是它提供了很多基于其他语言的驱动和客户端类库,不过在这些驱动中可能存在为了提升性能使用C语言扩展的情况,比如java类库可能用了JNI

10.1.14 32位的芒果数据库有哪些限制吗?
答: 芒果数据库使用内存映射文件。当使用32位的芒果数据库时,最大存储文件只有2GB(对于专注于大数据的芒果数据库来说,这显然是不允许的),所以基于这个原因不要将芒果数据库部署在32位的机器上
64位的芒果数据库几乎可以认为没有限制,对于生产环境,请使用64位的操作系统以及64位的芒果数据库

你可能感兴趣的:(mongodb)