`

MongoDB实战优化

阅读更多

Mongodb是一个高性能,可扩展数据库,并具有低延迟,高吞吐率的性能。但是使用过程中难免会有所坑,下面将介绍一些优化方案。

以下建议翻译自 亚马逊的 《Performance Best Practices for MongoDB 2015
补充是自己在Mongodb实践中的总结
 
1、Mongodb引擎
Mongodb 3.0 支持了2种引擎:
A、默认的 MMAPv1 引擎,老版本一种使用
B、WiredTiger 引擎,新支持的db引擎
这两种引擎可以在一个副本集中共存,他们之前的迁移是很容易,也就是说,从 MMAPv1 老的引擎升级到新的 WiredTiger 引擎是不会破坏原有数据的。
这两种引擎是为不同的业务场景做的优化,下面的优化方案会提及支持的相关引擎。
 
2、硬件优化

2.1、确保足够的内存:

保证内存大于数据存储大小,优化内存是最显而易见的方案
补充:实践证明,尽量保证数据块大小不要超出系统内存的一半,性能最优
 
2.2、在高写入应用中,使用SSD硬盘
Mongodb的落盘操作是随机的,一般60s落盘,100ms写journal,所以使用SSD硬盘一般会有很显著的写入20-50倍的提升。
补充:当内存在合理范围内,更换SSD硬盘并不会显著提升写性能,关闭journal会提升一些性能,但是可能会带来数据丢失的风险
 
2.3、压缩存储和I/O密集型负载
新的存储引擎 WiredTiger 允许压缩存储,设置合理的压缩配置,可以防止压缩过大导致的I/O密集型的CPU负载过高的情况。
 
2.4、使用更快的CPU
这点毋容置疑,新的存储引擎WiredTiger可以比MMAPv1更好的利用多核。
 
2.5、尽量将Mongodb实例独享物理设备
这儿也不用多说,独享设备肯定是最好
 
2.6、使用多个mongos
当集群增加后,也要相应的增加mongos
 
3、应用层优化
3.1、只更新需要更新的字段:
不是更新所有的字段,而只是更新需要更新的改变过的字段,这样可以避免检索文档所有的字段,减少网络传输和数据库负载。
 
3.2、避免单一 非 条件的查询:
如果单一的非条件查询,会进行全表扫描,尽量避免它
 
3.3、在你的应用中,使用 explain() 测试你的每一条语句
执行计划explain()可以让你有很多意想不到的收获
 
3.4、覆盖索引的查询
这个无需多说了,查询的条件尽可能多的覆盖索引
 
3.5、避免不带片键查询
在集群中,如果不带片键查询,会去每片查询,避免这样的操作
 
3.6、读写分离
因为主库和从库的同步延迟,如果应用能容忍延迟,最好是从库读,主库写
 
3.7、使用最新的客户端连接库
mongodb一直在不断的更新,尽量使用官方提供的最新连接库
 
3.8、分片均匀
如果 mongodb 采用分片,片键的选择非常重要,又要能分片均匀,又要保证读写性能高,还要保证可扩展
 
3.9、选择合适的片键
同上
 
补充:
4.0、大量更新批量操作
实际经验,如果一个集合有大量的upate或insert操作,那么与其一个个操作的去连接,不如汇聚到1000-5000条左右,一次性批量写入,可以有效减少锁的竞争情况,性能有显著提高。
 
4、结构设计和索引
4.1、尽量把数据存成一个文档
在合适的时候把数据存储为一个文档,可以非常高效的利于查询,这样搜索的条数就很少,打开展平对于搜索是不利的,但是过重的一个文档可能也会带来写的问题。
 
4.2、避免过大文档
Mongodb一个文档最大为16MB,在实际情况中,很多文档都是小于几KB的,比如在文档里维护一个很大的列表,应该将列表打开,一行一条记录。
 
4.3、避免文档无限的增长
Mongodb为了节约存储空间,会以 usePowerOf2Sizes 来增长一个文档的存储空间,举个例子:
比 如:第一次插入这个文档,文档大小为1KB,这时Mongodb会以2KB来存储,在文档增长到2KB以内时,是不会移动文档和索引存储块的。当这个文档 增长到 2KB 后,Mongodb又会设置 4KB 来存储它,每次都是以2倍的量存储,保证了空间的利用和存储块移动之间的平衡。如果一个文档不停的无限增长,可能会因为频繁的移动存储块而影响性能。
补充:实际情况中设置usePowerOf2Sizes这个参数,并没有显著的性能提升
 
4.4、避免大的索引数组
多字段索引可能会利于查询,但是会让写操作变慢,所以要权衡一下。
 
4.5、避免过长的字段名
Mongodb的字段名和sql不同,会占用文档的空间,增加网络传输压力,尽量用短小精简的字段名,可以在程序那边做映射。
补充:实际情况,设置短小精简的字段名,可以显著提升查询性能
 
4.6、避免 select * 的查询
这点和sql一样,用不到的字段不要返回了
补充:实际情况也是如此,不查询不需要的字段,显著提升性能
 
4.7、优化索引
避免索引命中不散列,比如对一个枚举,布尔值做索引,都是无效的
 
4.8、组合索引可以包含单个索引
比如有一个组合索引 {"lastname":1, "firstname":1},是没必要建立 {"lastname":1} 这个索引的,因为已经被包括在了组合索引里了
 
4.9、避免正则表达式没有命中索引
这个类似sql的like,如果要命中索引,必须从头开始匹配
 
4.10、使用 wiredtiger 引擎,索引放其他地方存储
使用 wiredtiger 引擎,索引可以放在其他地方存储,比如更快的硬盘,资源争抢I/O更少的磁盘
 
5、磁盘I/O
5.1、readhead需要设置为32
为了mongodb的性能,readhead这个值不能设置少于32,如果设置过多会浪费内存。
 
5.2、使用EXT4或者XFS文件系统,避免EXT3
EXT3文件系统太过陈旧,没有对数据库进行优化,不够高效
 
5.3、关闭 access time 设置
关闭对文件最后一次访问的时间记录,因为database一直在访问文件,所以关闭它能够提升性能
 
5.4、不要使用大量的虚拟内存
将虚拟内存设置为合理大小,不要设置过大
 
5.5、使用Raid10
使用Raid10来做存储,性能和数据安全都有保证
 
6、性能配置
6.1、做好性能测试
在应用上线之前,需要做性能测试来评估
 
6.2、片键
如果没有范围的片键搜索,建议使用hash来使用片键,如果有范围的搜索,建议将他们提前处理,然后并行搜索获取。
 
6.3、关闭块自动平衡
关闭自动移动块平衡,提升性能
补充:实际情况中,这个设置没有显著提升性能,建议还是打开
 
6.4、预热系统几分钟
这个看上去没啥用
 
6.5、对系统瓶颈进行监控
这个也是必须的
 
 
分享到:
评论

相关推荐

    《MongoDB实战》第2版-目录1

    在《MongoDB实战》第二版中,作者深入浅出地介绍了这个流行的NoSQL数据库系统,特别强调了它在现代Web开发中的重要地位。本章主要涵盖了MongoDB的关键特性,包括它的文档数据模型、查询机制、索引、复制、加速与持久...

    MongoDB进阶与实战:微服务整合、性能优化、架构管理.docx

    MongoDB 进阶与实战:微服务整合、性能优化、架构管理 MongoDB 是一种流行的开源非关系型数据库(NoSQL),它以文档为模型,使用类似于 JSON 的 BSON 格式进行数据存储。MongoDB 具有强大的查询和索引功能,并且...

    万亿级文档数据库MongoDB集群性能优化实践.pdf

    "MongoDB集群性能优化实践" 本文档主要介绍了MongoDB集群性能优化实践,涵盖了从 MongoDB 集群优化到解决方案的分享。通过本文档,我们可以了解到 MongoDB 集群性能优化的重要性,并学习到实际的解决方案。 知识点...

    Mongodb视频-燕十八 mongodb视频教程全集21讲+mongodb高级实战开发视频教程

    根据提供的文件信息,我们可以推断出这是一套关于MongoDB的视频教程,由燕十八主讲,包含了21讲的基础教程以及高级实战开发教程。接下来,我们将基于这些信息来生成相关的知识点。 ### MongoDB简介 MongoDB是一种...

    大数据存储MongoDB实战指南1

    ### 大数据存储MongoDB实战指南1知识点概览 #### 一、MongoDB简介与特点 - **开源性**:MongoDB是一款开源的NoSQL数据库系统,具备高度灵活性和可扩展性。 - **高性能**:它能够高效地处理大规模数据,并提供快速的...

    mongodb项目实战(初战)源代码

    在实战中,我们可能会学习如何在这个集合上执行增删改查操作,如何设计合适的文档结构以满足业务需求,以及如何优化查询性能等。 最后,MongoDB还支持复制集(Replica Sets)和分片(Sharding)以实现高可用性和...

    MongoDB管理与开发实战详解.pdf

    MongoDB的管理涉及了解其基本操作和技巧,例如如何安装和配置MongoDB,以及如何优化其性能和确保数据安全。MongoDB的扩展性体现在它能够简单地水平扩展,通过分片和复制集来支持大规模数据存储和高可用性。功能性...

    《MongoDB实战》第2版-第2章-JavaScript命令操作Mongodb1

    在《MongoDB实战》第二版的第二章中,作者主要讲解了如何通过JavaScript Shell操作MongoDB,包括基本的CRUD(创建、读取、更新、删除)操作、构建索引和使用`explain()`方法来优化查询,以及一些基础的数据库管理...

    Nodejs + mongoDB实战开发微博系统源码.zip

    《Node.js + MongoDB实战开发微博系统》 在现代Web开发中,Node.js以其异步非阻塞I/O和高效的性能,已经成为构建实时应用的理想选择。MongoDB作为一个强大的NoSQL数据库,以其灵活的数据模型和高性能,常被用于处理...

    《MongoDB实战》第2版-第5章-Mongodb查询1

    在《MongoDB实战》第2版的第5章中,作者深入探讨了如何构建和执行查询,特别是在电子商务领域的应用场景。本章主要内容包括理解查询一个电子商务数据模型、MongoDB查询语言的细节、查询选择器及其选项。 MongoDB...

    深入浅出MongoDB应用实战集群及系统架构

    ### MongoDB应用实战集群及系统架构 #### MongoDB简介 MongoDB是一种非常流行的开源文档数据库,它采用了NoSQL(非关系型数据库)技术,可以提供高性能、高可用性和易扩展性。MongoDB非常适合处理大规模数据和复杂...

    MongoDB实战1

    在《MongoDB 实战》这本书中,作者王文龙介绍了如何安装、配置及使用 MongoDB。以下是针对书中的几个关键知识点的详细说明: ### 第一部分 基础篇 #### 第一章 走进 MongoDB 1.1 为什么要用 NoSQL NoSQL(Not ...

    C#\MongoDB应用开发实战\MongoDB

    总的来说,"C#\MongoDB应用开发实战"课程将带你逐步掌握使用C#与MongoDB进行交互的各项技能,无论你是初学者还是有经验的开发者,都能从中受益,提升你的MongoDB开发能力。通过实际项目练习和理论知识的结合,你将...

    《MongoDB实战》第2版-第6章-聚合查询统计分析1

    《MongoDB实战》第二版的第6章聚焦于“聚合查询与统计分析”,这是数据库管理和数据分析的关键领域。MongoDB的聚合框架是其高级查询语言的一部分,它允许对数据进行复杂处理,生成在单个文档中不存在的新信息。这一...

    《MongoDB实战》第2版-第7章-原子性操作与事务1

    《MongoDB实战》第二版的第7章主要讲解了MongoDB中的原子性操作和事务,特别是如何更新和删除文档。本章的内容分为以下几个部分: 1. **文档更新概要**: MongoDB提供了两种更新文档的方式:完全替换文档和使用...

    mongoDB入门实战手册(中文版)

    ### MongoDB入门实战手册知识点概述 #### 一、MongoDB简介 MongoDB是一种开源的文档型数据库,属于NoSQL数据库的一种。它使用JSON格式的文档来存储数据,具有高性能、高可用性和易扩展性等特点,非常适合处理半结构...

    前端 Vue+Node+MongoDB高级全栈开发

    7. **优化部署**:最后,对应用进行优化,比如使用 Webpack 打包压缩资源文件,并部署到服务器上。 通过以上介绍,我们了解到 Vue.js、Node.js 和 MongoDB 在全栈开发中的重要作用及其各自的特性。这些技术结合在...

    深入云计算:MongoDB管理与开发实战详解 源代码

    本资源“深入云计算:MongoDB管理与开发实战详解 源代码”旨在为开发者和管理员提供全面的MongoDB知识,通过源代码实例帮助读者深入理解其核心概念和实践技巧。 在云计算领域,MongoDB常作为NoSQL数据库解决方案,...

    大数据高并发实战架构(Mongodb实现)

    大数据高并发实战架构(Mongodb实现)、网站大访问量、mysql索引优化、反向代理

    MongoDB原理与实战-阿里云-张友东

    #### 二、MongoDB数据持久化与性能优化 **1.4 MongoDB数据持久化机制** - **Journal**: 日志机制确保了数据写入磁盘前的持久性,即使系统崩溃也能保证数据完整性。 - **Oplog**: 操作日志记录了所有的更改,用于...

Global site tag (gtag.js) - Google Analytics