• 暂时停更一段时间!
  • 近期网站将陆续进行前端页面改造!
  • 招募网站编辑,联系站长!

MongoDB特性剖析

文章目录[隐藏]

存储引擎

一开始 MongoDB 仅仅支持 MMAP 存储引擎 ,到 了目前的 MongoDB已经支持多存储引擎 。

1) MMAPvl

这是 MongoDB 最开始的存储引擎 ,也是 3.2 版本之前的默认存储引擎 。 这就是比较简单的内存映射文件,支持集合级别的并发控制,不支持压缩 。

2 ) WiredTiger

这是 MongoDB 3 .0 引人的新的存储引擎,支持 MongoDB 的所有特性,是 3.2 版本的默认存储引擎 。 其提供文档级别( Document-Level )的并发控制、检查点( CheckPoint )、数据压缩和本地数据加密( Native Encryption )等功能 。

3) In-Memory

In-Memory 存储引擎用于将数据只存储在内存中,只将少量的元数据和诊断日志( Diagnostic )存储到硬盘文件中,由于不需要 D 烛的 I/O 操作就能获取所需的数据, InMemory 存储引擎大幅度降低了数据查询的延迟( Latency ),其支持文档级别的并发控制 。此存储引擎是 MongoDB 企业版本的特性,且只能用在 MongoDB64 位版本上 。

综上 ,如果你使用的版本支持 WiredTiger ,那就使用 WiredTiger。

可以通过 mongod 参数指定存储引擎 :

mongod --storageEngine wiredTiger | inMemory

索引

MongoDB 的索引数据结构也是 B 树,和之前介绍过的 MySQL 索引 基本一致 。 不过这里需要注意的是 ,由 于其底层采用的是内存映射文件,因此其是一种非聚集索引, 尽管 MongoDB 本身并没有这种定义 。

TTL

MongoDB 2.2 版本后引人了 TTL 集合,即支持对集合进行失效时间设置。 当超过指定时间后,集合会自动清除超时的文梢,这在保存一些诸如 Session 会话信息和存储缓存数据的时候非常有用 。

以下代码即表示以 crea te_time 为标准, 300 秒后删除相应的文梢 :

db .user_login_log . ensureindex ({ ” create time”: 1) , {expireAfterSeconds:300 })

自增 ID

MongoDB 没有类似 MySQL 一样的向增 ID 功能 。 其 _id 默认就是 Objectld ,是自动生成的 12 字节唯一标识。 如果想要使用自增 ID ,那么需要通过编程实现。

聚合操作

MongoDB 中的聚合使用 aggregate() , 用于处理数据 (诸如统计平均值、求和等),并返回计算后的数据结果 。 类似 SQL 语句中的 count(*)。

安全写人

上面提到 MongoDB 是 CP 特性,牺牲了可用性 。 但其实通过安全写入机制, 配置合适的 WriteConcern 是可以得到一定的可用性的 。

MongoDB 中一个写入操作的流程如下 。

1 )数据首先写入到 MongoDB 缓存中 。

2 )缓存定时异步刷写到 Journal 日志文件中,这里 Journal 是 MongoDB 的 预写日志,相当于 MySQL 的 redo log。

3) Journal 定时异步刷写到 MongoDB 的数据文件中 。

4 )如果插入操作或更新操作中包含索引列,同时会维护索引结构 。

5 )如果是副本集 , 数据还会写到 op log 定容集合中,这里的 oplog 相当于 MySQL 的 Binlo g ,用于从节点同步数据 。

使用提示

对 MangoDB 本身的使用需要注意如下几点 。

建议开启 Journaling 功能,特别是对于可用性要求较高的用户 。

MongoDB 只支持单一文档的原子’性 。

MongoDB 默认情况下是没有认证功能的,可以采取防火墙的方式进行保护,也可以进行相关的安全认证配置。

生产环境开启 profiling 功能,以监测慢请求 。

MongoDB 对内存的要求比较高,生产环境中 MongoDB 所在的主机应该配置尽量大的内存。

使用 MangoDB 进行数据操作需要注意如下几点 。

MongoDB 默认’情况下是区分大小写的 。

确保输入正确的数据类型,输入错误数据类型不会出现提示 。

MongoDB 的更新在默认情况下会使用类似于传统数据库的 LIMIT 语句,即 LIMIT l 。如果想要一次更新许多文档,需要把 multi 设为 true。

MongoDB 的翻页效率比较低 。 使用 find().skip().limit()的方式,务必要使用索引,否则会导致全表扫描几百万数据几乎不可用 。

不要使用负向查询 $nin 、 $not ,这样不会命中索引 。

查询条件不要使用算术运算符,如 $mod , 这样不会使用索引 。

MongoDB 中存储的文档必须有一个“_id”键, 不指定值时,默认是一个 0 问 ectld 对象 。

和 MySQL 一样,要减少不必要的或重复的索引,以避免更新或插入时对索引的维护开销 。

使用写入文档数组或者 Bulk Write 进行批量写,减少网络请求次数 。

作为主键的_id 值应该避免使用随机值( MDS , uuid 等),而应该使用向增值(比如默认的 Objectld ) 。


丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:MongoDB 特性剖析
喜欢 (0)
[247507792@qq.com]
分享 (0)
多啦H梦
关于作者:
热爱开源,热爱分享,谢谢大家的资瓷!

邀请您免费 注册账号 登录 即可参与讨论!