MongoDB性能优化

MongoDB作为高性能NoSQL数据库,在结合实际业务场景时,性能依然有很大的提升空间。事实上MongoDB已成为仅次于主流关系型数据库的持久化方案。

使用默认ID

MongoDB建议使用ObjectId,而不是自定义ID。因为ObjectId具有处理大型集合,分片等特性。

如果应需求而使用自定义ID,可以尝试findAndModify()结合自增序列。

缩减字段长度

MongoDB每个文档的字段名都需要占用一定的存储空间,短的字段名则会节省更多空间。

创建索引

MongoDB索引对查询、更新、删除、排序操作都会产生影响,建议每个集合的索引数控制在5以内。

遵循最左原则

与关系数据库一样,MongoDB复合索引也遵循最左原则,所以,使用复合索引时应在查询中包含最左索引字段。

创建稀疏索引

MongoDB索引默认是密集型的,即文档中的索引字段不存在,也会在索引中存在对应关系。稀疏索只包含具有索引键值的文档。

创建文本索引

MongoDB文本索引会增加文本搜索速度快,使用文本索引替代对文档的多字段查询。

发送操作符

直接把操作发送给数据库服务器执行,以节省来回读写数据时的传输时间。

限制排序集

MongoDB目前支持32M以内的结果集排序,如果排序应尽量限制结果集的大小。

限制低性能查询

MongoDB中有一些查询操作符性能并不好,所以能避则避。

$exist、$ne、$not、$nin、$or、$in

定期归档

对于不常用的数据进行归档处理,对数据库优化而言很常见,MongoDB也不例外。

使用TTL索引

MongoDB TTL索引能够将过期的文档进行老化处理,当达到老化阀值后文档会被删除。

固定集合

MongoDB自动创建集合的特性,很少需要声明式的创建集合,但如果有自动删除文档的需求,可以使用声明的方式创建固定大小的集合,在文档达到集合最大上限时,最先放入的文档会被自动移除。

MongoDB wiredtiger引擎调优

优化I/O处理

升级到SSD,将wiredtiger数据与journal分布在不同的盘上,加大内存以增加wiredtiger cache,以此来优化I/O处理。

eviction参数调优

MongoDB wiredtiger支持以下优化参数:

eviction_target    80    当cache used超过eviction_target,evict线程开始淘汰CLEAN PAGE
eviction_trigger    95    当cache used超过eviction_trigger,用户线程也开始淘汰CLEAN PAGE
eviction_dirty_target    5    当cache dirty超过eviction_dirty_target,evict线程开始淘汰DIRTY PAGE
eviction_dirty_trigger    20    当cache dirty超过eviction_dirty_trigger, 用户线程也开始淘汰DIRTY PAGE

降低eviction_target、eviction_dirty_target,让evict尽早将数据从wiredtiger cache刷到操作系统的page cache,以便提早刷盘。
db.runCommand({setParameter: 1, wiredTigerEngineRuntimeConfig: “eviction_dirty_target=5,eviction_target=80″})

mongodb集群性能优化

启用XFS文件系统

XFS是一个高度可扩展的高性能文件系统。XFS是Red Hat Enterprise Linux 7的默认文件系统。

XFS文件系统主要有以下特点:

XFS支持元数据日记功能,这有助于更快地进行崩溃恢复。
XFS文件系统也可以在安装和激活时进行碎片整理。
此外,Red Hat Enterprise Linux 7还支持特定于XFS的备份和还原程序。

调整NUMA参数

NUMA是多核心CPU架构中的一种,其全称为Non-Uniform Memory Access,在NUMA多核心CPU中,机器的物理内存是分配给各个核的,每个核访问分配给自己的内存会比访问分配给其它核的内存要快。