MongoDB性能优化

MongoDB作为高性能NoSQL数据库,事实上已成为仅次于主流关系型数据库的持久化方案。在此介绍一些最佳实践和经典业务场景优化方案。

使用默认ID

MongoDB推荐使用ObjectId,而非自定义ID。ObjectId能够处理大型集合、具有分片等特性。若需使用自定义ID,可尝试findAndModify()结合自增序列。

注:findAndModify为原子操作。

缩减字段名

MongoDB文档字段名占用一定的存储空间,短的字段名会节省更多空间。

创建索引

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

最左原则

MongoDB复合索引也遵循最左原则,使用复合索引时,在查询中包含最左索引字段。

稀疏索引

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

文本索引

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

发送操作符

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

限制排序集

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

限制低性能查询

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

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

定期归档

对不常用的数据进行归档。

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

集群优化

启用XFS文件系统

XFS是一个高度可扩展的高性能文件系统。也是Red Hat Enterprise Linux 7的默认文件系统,XFS文件系统有以下特点:

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

调整NUMA参数

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