MongoDB性能系列最佳实践-数据建模与内存优化

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
云数据库 Tair(兼容Redis),内存型 2GB
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
简介: 帮助用户在多个关键方面实现规模化性能优化

这个系列适用于谁?


虽然我们将要介绍的最佳实践并非面面俱到,但在本系列中会有一些建议对您很有用,无论您是:

  • 刚开始您的第一个项目还是经验丰富的MongoDB开发人员。
  • 在使用全托管云数据库MongoDB 服务,或自建MongoDB。


我们在本文中要涵盖什么内容?

我们将从两个关键考虑因素开始,这将为我们在接下来的博客系列中讨论的所有性能最佳实践奠定基础。首先,我们将讨论模式设计以及为您启动的关键资源,然后转向为您的应用程序中最常访问的数据和索引调整RAM大小。这就是我们所称的“工作集”。


数据建模至关重要

性能优化的第一步是了解应用程序的查询模式,从而设计数据模型并相应地选择适当的索引。根据应用程序的查询模式调整数据模型可以生成更高效的查询,增加插入和更新操作的吞吐量,并更有效地在分片集群中分配工作负载。


虽然MongoDB具有灵活的模式,但这并不意味着您可以忽视模式设计!虽然您随时可以修改模式,但在项目初期遵循模式设计的最佳实践将有助于避免未来的潜在重构工作。


JSON文档的一个主要优势是您可以根据应用程序的需要灵活地数据建模。数组和子文档的嵌套使得文档能够很好地表达数据之间的复杂关系。但您还可以将数据建模为平面、表格和列式结构,或者简单的键值对、文本、地理空间和时间序列数据,甚至是连接图数据结构的节点和边缘。最佳的模式设计将由您的应用程序查询模式来确定。


数据建模的关键考虑因素和资源

在设计数据模型时,您需要首先做出的决策之一是如何对数据之间的关系进行建模。决定何时在单个文档内嵌入一个文档,或者在不同集合中的单独文档之间创建引用,是一个应用程序特定的考虑。然而,在模式设计过程中,有一些通用的考虑因素可以指导这个决策。


嵌入

具有1:1关系的数据显然是单个文档内嵌入的明显和自然的选择。具有一对多关系的数据,其中“多”个对象始终与其父文档一起出现或在其上下文中查看,也最适合通过嵌入来处理。因为这些数据总是一起访问,将其一起存储在同一文档中是最优的。


由于数据的本地性,嵌入通常在读取操作方面提供更好的性能,因为可以通过单个内部数据库操作请求和检索相关数据,而不是查找存储在不同集合中的文档。嵌入数据模型还使得在单个原子写操作中更新相关数据成为可能,因为单个文档写入是事务性的。


然而,并不是所有的1:1和一对多关系都适合嵌入到单个文档中。在以下情况下应该在不同集合的文档之间使用引用:

  • 经常读取一个文档,但包含的数据很少被访问。将这些数据嵌入只会增加集合的内存需求(工作集)。
  • 文档的某个部分经常被更新,并且大小不断增长,而文档的其余部分相对静态。
  • 组合文档大小会超过MongoDB的16MB文档限制,例如在建模多对一关系时,如产品评论与产品之间的关系。


引用

引用可以帮助解决上述提到的挑战,并且通常在建模多对多关系时使用。然而,应用程序需要发出后续查询来解析引用,需要额外的往返服务器通信,或者需要使用MongoDB的‘$lookup’聚合管道阶段执行“连接”操作。


深入挖掘

数据建模是一个广泛的主题,并且已经填补了以前的博客系列。为了帮助您做出正确的决策,以下是您应该审查的关键资源摘要:


  • MongoDB文档提供了关于数据建模的广泛部分,从文档数据模型的高级概念开始,然后逐渐进展到实际示例和设计模式,包括有关引用和嵌入的更多详细信息。
  • 您还应该查阅我们的“使用模式构建”博客系列,以了解有关不同用例的特定模式设计最佳实践,包括目录和内容管理、物联网、移动应用、分析和单一视图(即客户360)。它将这些用例与特定的模式设计模式进行叠加,如版本控制、分桶、引用和图形。
  • MongoDB大学提供了一个免费的基于Web的数据建模培训课程。这是一个了解文档数据模型中模式设计的学习的好方法。


审查您的数据模型

一旦您开发了初始数据模型并开始填充样本应用程序数据,有能力对其进行审查将会很有帮助。


MongoDB Compass是MongoDB的免费GUI工具。您可以在Compass上做很多事情,所以在这个博客系列中我们会经常回到这个工具。其中最有用的功能之一是模式可视化,使您能够使用直方图探索您的模式,显示文档字段、数据类型和值。正如您将在系列后面看到的那样,您还可以直接从Compass UI可视化查询解释计划和索引覆盖范围。

图 1:在 MongoDB Compass 中可视化您的架构


在图1中,我们正在审查存储在"restaurants"集合中的文档模式。对于采样的文档,Compass显示字段在每个文档中出现的频率,它们包含的值的范围以及数据类型,以及"categories"数组中的元素数量。Compass文档中详细介绍了如何分析您的模式。


开始使用文档

探索和实验数据建模的最佳方法是在完全托管的阿里云云服务上启动MongoDB。


我们的文档将指导您如何在您选择的地区和云提供商上创建一个免费的MongoDB数据库集群。您还可以加载我们的示例数据集,以便轻松入门文档。


内存大小:确保您的工作集适合内存

除了数据建模之外,性能优化的第二个主要考虑因素是调整您的工作集大小。


与大多数数据库一样,当应用程序的工作集(索引和最常访问的数据)适合内存时,MongoDB的性能最佳。RAM大小是实例大小的最重要因素;如果内存不足,其他优化可能无法显著提高数据库的性能。如果性能与价格/性能之间存在权衡,那么使用快速的SSD来补充较小的RAM量是一种可行的设计选择。您应该测试以找到适合您工作负载和SLA的最佳平衡。


当应用程序的工作集适合内存时,从磁盘读取的活动将会很低。您可以使用我们将在查询分析博客文章中介绍的工具来分析这一点,这是本系列的下一步内容。


如果您的工作集超过所选实例大小或服务器的RAM,请考虑迁移到具有更多内存的实例,或者将数据库分区(分片)到多个服务器上。


无论您是使用云托管MongoDB还是自己管理MongoDB,正确调整工作集大小都是必要的。

  • 如您使用阿里云,请查阅阿里云MongoDB 官方文档,以获取有关计算工作集大小的指导。
  • 在本系列后面,我们将更深入地探讨自建的MongoDB硬件大小调整问题。


在阿里云MongoDB 中,扩展计算和存储非常简单。您可以选择进入集群层自动缩放,以响应应用程序需求的变化来调整计算容量。


在阿里云MongoDB中,集群层自动缩放会在定义的时间段内监控CPU和内存利用率,并在您配置的限制内调整实例大小。所有缩放事件都是以滚动方式执行的,因此不会对您的应用程序产生影响。撰写本文时,自动缩放是一个测试功能。如果您想要自己控制缩放事件,那么您可以在阿里云MongoDB 控制台中只需点击几下鼠标,或通过API调用来实现。

立即免费试用阿里云MongoDB


扫码加入钉群,与MongoDB专家一对一沟通,了解更多阿里云MongoDB产品与方案,市场活动及线上培训等内容。

钉钉入群二维码_Fotor.png

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
2月前
|
Kubernetes Cloud Native Java
云原生之旅:从容器到微服务的演进之路Java 内存管理:垃圾收集器与性能调优
【8月更文挑战第30天】在数字化时代的浪潮中,企业如何乘风破浪?云原生技术提供了一个强有力的桨。本文将带你从容器技术的基石出发,探索微服务架构的奥秘,最终实现在云端自由翱翔的梦想。我们将一起见证代码如何转化为业务的翅膀,让你的应用在云海中高飞。
|
3月前
|
存储 安全 数据库
阿里云服务器计算型、通用型、内存型主要实例规格性能特点和适用场景汇总
阿里云服务器ECS计算型、通用型、内存型规格族属于独享型云服务器,在高负载不会出现计算资源争夺现象,因为每一个vCPU都对应一个Intel ® Xeon ®处理器核心的超线程,具有性能稳定且资源独享的特点。本文为大家整理汇总了阿里云服务器ECS计算型、通用型、内存型主要实例规格族具体实例规格有哪些,各个实例规格的性能特点和主要适用场景。
阿里云服务器计算型、通用型、内存型主要实例规格性能特点和适用场景汇总
|
19天前
|
缓存 Java 测试技术
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
使用JMeter对项目各个接口进行压力测试,并对前端进行动静分离优化,优化三级分类查询接口的性能
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
|
12天前
|
监控 算法 Java
深入理解Java中的垃圾回收机制在Java编程中,垃圾回收(Garbage Collection, GC)是一个核心概念,它自动管理内存,帮助开发者避免内存泄漏和溢出问题。本文将探讨Java中的垃圾回收机制,包括其基本原理、不同类型的垃圾收集器以及如何调优垃圾回收性能。通过深入浅出的方式,让读者对Java的垃圾回收有一个全面的认识。
本文详细介绍了Java中的垃圾回收机制,从基本原理到不同类型垃圾收集器的工作原理,再到实际调优策略。通过通俗易懂的语言和条理清晰的解释,帮助读者更好地理解和应用Java的垃圾回收技术,从而编写出更高效、稳定的Java应用程序。
|
26天前
|
安全 Java API
【性能与安全的双重飞跃】JDK 22外部函数与内存API:JNI的继任者,引领Java新潮流!
【9月更文挑战第7天】JDK 22外部函数与内存API的发布,标志着Java在性能与安全性方面实现了双重飞跃。作为JNI的继任者,这一新特性不仅简化了Java与本地代码的交互过程,还提升了程序的性能和安全性。我们有理由相信,在外部函数与内存API的引领下,Java将开启一个全新的编程时代,为开发者们带来更加高效、更加安全的编程体验。让我们共同期待Java在未来的辉煌成就!
49 11
|
27天前
|
安全 Java API
【本地与Java无缝对接】JDK 22外部函数和内存API:JNI终结者,性能与安全双提升!
【9月更文挑战第6天】JDK 22的外部函数和内存API无疑是Java编程语言发展史上的一个重要里程碑。它不仅解决了JNI的诸多局限和挑战,还为Java与本地代码的互操作提供了更加高效、安全和简洁的解决方案。随着FFM API的逐渐成熟和完善,我们有理由相信,Java将在更多领域展现出其强大的生命力和竞争力。让我们共同期待Java编程新纪元的到来!
45 11
|
2月前
|
存储 机器学习/深度学习 算法
Adam-mini:内存占用减半,性能更优的深度学习优化器
论文提出一种新的优化器Adam-mini,在不牺牲性能的情况下减少Adam优化器的内存占用。
96 10
Adam-mini:内存占用减半,性能更优的深度学习优化器
|
2月前
|
JSON NoSQL MongoDB
MongoDB Schema设计实战指南:优化数据结构,提升查询性能与数据一致性
【8月更文挑战第24天】MongoDB是一款领先的NoSQL数据库,其灵活的文档模型突破了传统关系型数据库的限制。它允许自定义数据结构,适应多样化的数据需求。设计MongoDB的Schema时需考虑数据访问模式、一致性需求及性能因素。设计原则强调简洁性、查询优化与合理使用索引。例如,在构建博客系统时,可以通过精心设计文章和用户的集合结构来提高查询效率并确保数据一致性。正确设计能够充分发挥MongoDB的优势,实现高效的数据管理。
41 3
|
2月前
|
存储 NoSQL JavaScript
MongoDB存储过程实战:聚合框架、脚本、最佳实践,一文全掌握!
【8月更文挑战第24天】MongoDB是一款备受欢迎的文档型NoSQL数据库,以灵活的数据模型和强大功能著称。尽管其存储过程支持不如传统关系型数据库,本文深入探讨了MongoDB在此方面的最佳实践。包括利用聚合框架处理复杂业务逻辑、封装业务逻辑提高复用性、运用JavaScript脚本实现类似存储过程的功能以及考虑集成其他工具提升数据处理能力。通过示例代码展示如何创建订单处理集合并定义验证规则,虽未直接实现存储过程,但有效地演示了如何借助JavaScript脚本处理业务逻辑,为开发者提供更多实用指导。
33 2
|
19天前
|
监控 算法 数据可视化
深入解析Android应用开发中的高效内存管理策略在移动应用开发领域,Android平台因其开放性和灵活性备受开发者青睐。然而,随之而来的是内存管理的复杂性,这对开发者提出了更高的要求。高效的内存管理不仅能够提升应用的性能,还能有效避免因内存泄漏导致的应用崩溃。本文将探讨Android应用开发中的内存管理问题,并提供一系列实用的优化策略,帮助开发者打造更稳定、更高效的应用。
在Android开发中,内存管理是一个绕不开的话题。良好的内存管理机制不仅可以提高应用的运行效率,还能有效预防内存泄漏和过度消耗,从而延长电池寿命并提升用户体验。本文从Android内存管理的基本原理出发,详细讨论了几种常见的内存管理技巧,包括内存泄漏的检测与修复、内存分配与回收的优化方法,以及如何通过合理的编程习惯减少内存开销。通过对这些内容的阐述,旨在为Android开发者提供一套系统化的内存优化指南,助力开发出更加流畅稳定的应用。
38 0

相关产品

  • 云数据库 MongoDB 版
  • 下一篇
    无影云桌面