开发高性能的MongoDB应用:浅谈MongoDB性能优化

掌握Spring Data MongoDB,打造高性能后端应用 本文旨在为Java开发者提供一份全面的Spring Data MongoDB指南,涵盖从基础概念到高级优化的所有关键方面。Spring Data MongoDB的核心架构和工作原理高效的文档数据建模策略查询和聚合操作的性能优化与Spring生态系统的深度集成生产环境下的最佳实践第2章介绍核心概念与架构第3章深入Repository实现原理第4章讲解MongoDB特有的数据建模第5章通过电商案例展示完整实现第6-8章聚焦性能优化和高级特性文档(Document) 阅读详情

db.detail.ensureIndex({"code": 1,"date": -1,"time": -1 })




db.k_ri.ensureIndex({"code": 1,"date": -1})

db.k_ri.stats()   
db.k_ri.storageSize()  
db.k_ri.totalIndexSize()  
db.k_ri.totalSize() 

db.k_ri.dataSize()

性能与用户量

“如何能让软件拥有更高的性能?”,我想这是一个大部分开发者都思考过的问题。性能往往决定了一个软件的质量,如果你开发的是一个互联网产品,那么你的产品性能将更加受到考验,因为你面对的是广大的互联网用户,他们可不是那么有耐心的。严重点说,页面的加载速度每增加一秒也许都会使你失去一部分用户,也就是说,加载速度和用户量是成反比的。那么用户能够接受的加载速度到底是多少呢?

如图,如果页面加载时间超过10s那么用户就会离开,如果1s–10s的话就需要有提示,但如果我们的页面没有提示的话需要多快的加载速度呢?是的,1s 。

当然,这是站在一个产品经理的角度来说的,但如果站在一个技术人员的角度来说呢?加载速度和用户量就是成正比的,你的用户数量越多需要处理的数据当然也就越多,加载速度当然也就越慢。这是一件很有趣的事,所以如果你的产品如果是一件激动人心的产品,那么作为技术人员你需要做的事就是让软件的性能和用户的数量同时增长,甚至性能增长要快于用户量的增长。

数据库性能对软件整体性能的影响是不言而喻的,那么,当我们使用MongoDB时改如何提高数据库性能呢?

1.范式化与反范式化?

在项目设计阶段,明确集合的用途是对性能调优非常重要的一步。

从性能优化的角度来看,集合的设计我们需要考虑的是集合中数据的常用操作,例如我们需要设计一个日志(log)集合,日志的查看频率不高,但写入频率却很高,那么我们就可以得到这个集合中常用的操作是更新(增删改)。如果我们要保存的是城市列表呢?显而易见,这个集合是一个查看频率很高,但写入频率很低的集合,那么常用的操作就是查询。

对于频繁更新和频繁查询的集合,我们最需要关注的重点是他们的范式化程度,在上篇范式化与反范式化的介绍中我们了解到,范式化与反范式化的合理运用对于性能的提高至关重要。然而这种设计的使用非常灵活,假设现在我们需要存储一篇图书及其作者,在MongoDB中的关联就可以体现为以下几种形式:

1.1 完全分离(范式化设计)

示例1:

我们将作者(comment) 的id数组作为一个字段添加到了图书中去。这样的设计方式是在非关系型数据库中常用的,也就是我们所说的范式化设计。在MongoDB中我们将与主键没有直接关系的图书单独提取到另一个集合,用存储主键的方式进行关联查询。当我们要查询文章和评论时需要先查询到所需的文章,再从文章中获取评论id,最后用获得的完整的文章及其评论。在这种情况下查询性能显然是不理想的。但当某位作者的信息需要修改时,范式化的维护优势就凸显出来了,我们无需考虑此作者关联的图书,直接进行修改此作者的字段即可。

1.2 完全内嵌(反范式化设计)

示例2:

在这个示例中我们将作者的字段完全嵌入到了图书中去,在查询的时候直接查询图书即可获得所对应作者的全部信息,但因一个作者可能有多本著作,当修改某位作者的信息时时,我们需要遍历所有图书以找到该作者,将其修改。

1.3 部分内嵌(折中方案)

示例3:

这次我们将作者字段中的最常用的一部分提取出来。当我们只需要获得图书和作者名时,无需再次进入作者集合进行查询,仅在图书集合查询即可获得。

这种方式是一种相对折中的方式,既保证了查询效率,也保证的更新效率。但这样的方式显然要比前两种较难以掌握,难点在于需要与实际业务进行结合来寻找合适的提取字段。如同示例3所述,名字显然不是一个经常修改的字段,这样的字段如果提取出来是没问题的,但如果提取出来的字段是一个经常修改的字段(比如age)的话,我们依旧在更新这个字段时需要大范围的寻找并依此进行更新。

在上面三个示例中,第一个示例的更新效率是最高的,但查询效率是最低的,而第二个示例的查询效率最高,但更新效率最低。所以在实际的工作中我们需要根据自己实际的需要来设计表中的字段,以获得最高的效率。

2.理解填充因子

何为填充因子?

填充因子(padding factor)是MongoDB为文档的扩展而预留的增长空间,因为MongoDB的文档是以顺序表的方式存储的,每个文档之间会非常紧凑,如图所示。

(注:图片出处:《MongoDB The Definitive Guide》)

1.元素之间没有多余的可增长空间。

2.当我们对顺序表中某个元素的大小进行增长的时候,就会导致原来分配的空间不足,只能要求其向后移动。

3.当修改元素移动后,后续插入的文档都会提供一定的填充因子,以便于文档频繁的修改,如果没有不再有文档因增大而移动的话,后续插入的文档的填充因子会依此减小。

填充因子的理解之所以重要,是因为文档的移动非常消耗性能,频繁的移动会大大增加系统的负担,在实际开发中最有可能会让文档体积变大的因素是数组,所以如果我们的文档会频繁修改并增大空间的话,则一定要充分考虑填充因子。

那么如果我们的文档是个常常会扩展的话,应该如何提高性能?

两种方案

1.增加初始分配空间。在集合的属性中包含一个 usePowerOf2Sizes 属性,当这个选项为true时,系统会将后续插入的文档,初始空间都分配为2的N次方。这种分配机制适用于一个数据会频繁变更的集合使用,他会给每个文档留有更大的空间,但因此空间的分配不会像原来那样高效,如果你的集合在更新时不会频繁的出现移动现象,这种分配方式会导致写入速度相对变慢。

2.我们可以利用数据强行将初始分配空间扩大。

是的,这样看起来可能不太优雅…但有时却很有效!当我们对这个文档进行增长式修改时,只要将stuff字段删掉即可。当然,这个stuff字段随便你怎么起名,包括里边的填充字符当然也是可以随意添加的。

3.准确利用索引

索引对于一个数据库的影响相信大家一定了解,如果一个查询命令进入到数据库中后,查询优化器没有找到合适的索引,那么数据库会进行全集合扫描(在RDBMS中也叫全表扫描),全集合查询对于性能的影响是灾难性的。没有索引的查询就如同在词典那毫无规律的海量词汇中获得某个你想要的词汇,但这个词典是没有目录的,只能通过逐页来查找。这样的查找可能会让你耗费几个小时的时间,但如果要求你查询词汇的频率如同用户访问的频率一样的话。。。嘿嘿,我相信你一定会大喊“老子不干了!”。显然计算机不会这样喊,它一直是一个勤勤恳恳的员工,不论多么苛刻的请求他都会完成。所以请通过索引善待你的计算机:D。

在MongoDB中索引的类型与RDBMS中大体一致,我们不做过多重复,我们来看一下在MongoDB中如何才能更高效的利用索引。

3.1 索引越少越好

索引可以极大地提高查询性能,那么索引是不是越多越好?答案是否定的,并且索引并非越多越好,而是越少越好。每当你建立一个索引时,系统会为你添加一个索引表,用于索引指定的列,然而当你对已建立索引的列进行插入或修改时,数据库则需要对原来的索引表进行重新排序,重新排序的过程非常消耗性能,但应对少量的索引压力并不是很大,但如果索引的数量较多的话对于性能的影响可想而知。所以在创建索引时需要谨慎建立索引,要把每个索引的功能都要发挥到极致,也就是说在可以满足索引需求的情况下,索引的数量越少越好。

  • 隐式索引

我们在查询时可以迅速的将age,no字段进行排序,隐式索引指的是如果我们想要排序的字段包含在已建立的复合索引中则无需重复建立索引。

如以上两个排序查询,均可使用上面的复合索引,而不需要重新建立索引。

  • ?翻转索引

翻转索引很好理解,就是我们在排序查询时无需考虑索引列的方向,例如这个例子中我们在查询时可以将排序条件写为”{‘age’: 0}”,依旧不会影响性能。

3.2 索引列颗粒越小越好

什么叫颗粒越小越好?在索引列中每个数据的重复数量称为颗粒,也叫作索引的基数。如果数据的颗粒过大,索引就无法发挥该有的性能。例如,我们拥有一个”age”列索引,如果在”age”列中,20岁占了50%,如果现在要查询一个20岁,名叫”Tom”的人,我们则需要在表的50%的数据中查询,索引的作用大大降低。所以,我们在建立索引时要尽量将数据颗粒小的列放在索引左侧,以保证索引发挥最大的作用。

mongodb group aggregate项目实战笔记 mongodb group aggregate项目实战笔记 管道聚合 mongodb group按时间分组,用aggregate管道聚合 会比group的处理效率要高而且更灵活方便 立即下载

相关推荐

Oracle Patch清理

- opatch clean的帮助,该命令清除.patch_storage directory文件夹下的'restore.sh,make.txt' files and 'scratch,backup'-- 执行完毕后,貌似没有变化,可能和自己环境有关(19年开始测试补丁,基本上每个季度都测试,后面把又把数据库用RMAN做了迁移,又转换成了PDB模式)。在对Oracle安装补丁后,会发现OS上被占用了大量的空间,本文档清理Opatch过程中的一些文件,释放空间。--清理后空间,剩余25G。

文档搬运工 1063

MongoDB aggregate性能优化与排序

MongoDB 在使用aggregate操作对数据进行处理时,需要显示排序操作,否则性能上会有很大的差别。

www_xue_xi的博客 4989

计算机毕业设计springboot股票模拟交易系统的设计与实现u6m959【附源码+数据库+部署+LW】

选题背景: 随着互联网和金融科技的快速发展,股票市场成为了吸引人们关注和参与的重要领域之一。越来越多的人开始对股票投资感兴趣,希望通过交易股票来获取收益。然而,对于初学者来说,股票市场的复杂性和风险往往让他们望而却步。因此,设计和实现一个股票模拟交易系统,可以帮助初学者更好地理解和掌握股票交易的规则和技巧,提高他们的投资决策能力。 意义: 股票模拟交易系统的设计与实现具有以下几个重要意义: 提供实践机会:股票模拟交易系统为投资者提供了一个实践的平台,使他们能够在真实市场环境下进行模拟交易,了解股票市场的

gp12081的博客 1754

mongodb系列(一)mongoose find普通查询与aggregate聚合查询的 简单性能对比

背景 mongodb 3.4,使用默认的配置(没有调整内存限制或其他性能配置),数据库有90万+条数据   开始实验 以下分别使用 find 查询 和 aggregate 聚合查询 以下为dao层(server/dao/cmsResourceDao.js),基于mongoose查询mongodb getModel(){ return mongoose.model(...

JadonYuen的学习笔记 1万+

ONFI5.0命令字实战指南:从基础操作到高级应用

本文深入解析ONFI5.0协议的核心——命令字,提供从基础操作到高级应用的实战指南。详细拆解了NAND闪存的复位、读状态、数据读取(00-30)、页编程(80-10)和块擦除(60-D0)等关键命令周期,并探讨了多平面操作与缓存操作等高级性能优化技巧,帮助开发者高效、稳定地与NAND芯片进行底层交互。

vscode5coder的博客 457

Dify Rerank 模型配置全流程解析:从报错定位到代码实现

Dify Rerank 模型配置全流程解析:从报错定位到代码实现

engchina的专栏 4461

mongodb aggregate 性能优化_百万级高并发mongodb集群性能数十倍提升优化实践

背景线上某集群峰值TPS超过100万/秒左右(主要为写流量,读流量很低),峰值tps几乎已经到达集群上限,同时平均时延也超过100ms,随着读写流量的进一步增加,时延抖动严重影响业务可用性。该集群采用mongodb天然的分片模式架构,数据均衡的分布于各个分片中,添加片键启用分片功能后实现完美的负载均衡。集群每个节点流量监控如下图所示:从上图可以看出集群流量比较大,峰值已经突破120万/秒,其中de...

weixin_33130645的博客 1087

BMS硬件设计核心:安全、精度与EMC的工程平衡

电池管理系统(BMS)是保障锂电安全运行的关键嵌入式子系统,其本质是在高精度模拟测量、实时故障响应与复杂电磁环境适应性之间达成工程平衡。原理上,BMS依赖专用监测芯片(如BQ76920)实现微秒级硬件保护,结合主控MCU(如STM32)完成策略决策与通信管理,形成‘安全协处理器+智能主控’双架构。技术价值体现在对过压/欠压/过流/温度等多维故障的毫秒级闭环处置能力,支撑SOC/SOH估算可信度与系统鲁棒性。典型应用场景涵盖电动工具、轻型电动车及储能模块等中低串数电池组。本文聚焦BMS控制板在时钟布局、电源滤

weixin_30591519的博客 66

MongoDB内容分享(七):MongoDB 性能:查询聚合优化

索引的添加只是解决了针对索引字段查询的效率,但是并不能解决查询之后数据的聚合问题。毕竟是对于大量数据的操作,光从IO就已经远超通常的OLTP操作,所以要求达到OLTP操作的速度和并发是不现实的,也是没有意义的。毕竟是对于大量数据的操作,光从IO就已经远超通常的OLTP操作,所以要求达到OLTP操作的速度和并发是不现实的,也是没有意义的。为了定位查询,需要查看当前mongo profile的级别, profile的级别有0|1|2,分别代表意思: 0代表关闭,1代表记录慢命令,2代表全部。

之乎者也·的博客 2087

13、基因相似性度量的相关性及特征选择研究

本文研究了基因相似性度量和特征选择在生物学中的应用,详细介绍了GO术语相似性度量的多种方法,包括语义度量和路径长度度量,并分析了不同方法在酵母和人类数据集上的表现。研究发现,Avg-sum方法和基于路径长度的度量在多数情况下效果较好。此外,通过晚期辐射毒性预测的案例研究,探讨了特征选择的重要性及可能面临的过拟合和噪声干扰问题,并提出了相应的解决策略。

js777的博客 123

RK3568开发笔记- (TX/RX) RGMII delayline 功能调试

本文详细介绍了RK3568芯片RGMII接口delayline功能的调试过程。针对千兆以太网通信不稳定问题,通过分析RGMII时序要求,利用RK3568内置的delayline功能补偿信号延迟。调试方法包括扫描delayline窗口、测试中间值配置、优化硬件设计等步骤。文章还总结了常见问题解决方案,如PHY选型建议和自动扫描功能配置。最终实现了千兆速率下丢包率降至0.01%以下的目标,为类似开发场景提供了实用参考。

flypig has a dream! 309

mongoDB aggregate聚合分析

简介 聚集操作实际上是对数据进行统计分析时使用的,简单的说,可以理解为SQL中的聚合操作,MongoDB中的聚集操作是为了大数据分析做准备的,这里简单介绍一下聚集框架aggregate的使用。 管道模式聚集分析 MongoDB的聚合框架是参考UNIX上的管道命令实现的,数据通过一个多步骤的管道,每个步骤都会对数据进行加工处理,最后返回需要的结果集。管道聚集是可以操作一个分片的集合的(The...

夏客柯 2070

哨兵1号回波数据(L0级)FDBAQ压缩算法详解

本文介绍哨兵1号用的FDBAQ算法,它实现非整数可变bit压缩,大部分数据仅需 3bit输出,少数高反射率数据需4bit输出,使得平均输出比特率刚超过3bit,比熵约束分块自适应量化 (ECBAQ)压缩算法所需的3.7bit更低。也就是说FDBAQ压缩完,除了要记录分块尺寸和各块的均值码(对应哨兵1号数据包里的THIDX)外,还需要记录霍夫曼码字的长度(对应哨兵1号数据包里的BRC)。唯一不同的就是量化后的编码规则使用了霍夫曼编码,相当于在传统的BAQ压缩流程的后面又加了一个步骤。

2288

mongodb mysql 查询性能优化_开发高性能的MongoDB应用—浅谈MongoDB性能优化

关联文章索引:性能与用户量“如何能让软件拥有更高的性能?”,我想这是一个大部分开发者都思考过的问题。性能往往决定了一个软件的质量,如果你开发的是一个互联网产品,那么你的产品性能将更加受到考验,因为你面对的是广大的互联网用户,他们可不是那么有耐心的。严重点说,页面的加载速度每增加一秒也许都会使你失去一部分用户,也就是说,加载速度和用户量是成反比的。那么用户能够接受的加载速度到底是多少呢?如图,如果页...

weixin_39706861的博客 250

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Spring Boot 3 与 MongoDB:构建高性能 NoSQL 应用的指南

Spring Data MongoDB 进一步简化了 MongoDB 的操作。开发者只需定义实体类和 Repository 接口,就能实现对 MongoDB 的 CRUD 操作,大幅减少样板代码。本文带着大家一步一步的集成MongoDB。

竹密无妨溪水过,天高不碍白云飞 1073

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

构建高性能的MongoDB数据迁移工具:Java的开发实践

面对数百万条记录的数据量,我们采用了分阶段的迁移策略,先进行了小规模的测试迁移以验证方案的可行性,随后逐步扩大迁移范围直至全部完成。例如,在一个电商平台上,随着商品种类和订单数量的快速增长,原有的数据库结构可能无法满足新的查询需求,这时就需要对数据进行重新组织或迁移。例如,在一个新闻网站中,对于文章内容的迁移可以采用全量迁移,而对于评论系统,则应考虑增量或实时迁移。感激不尽,咱们一起加油哦!你可以把这里当作自己的家,无论是工作之余的小憩,还是寻找灵感的驿站,我都希望你能在这里找到属于你的那份快乐和满足。

master_chenchen的博客 787

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Hive 项目 PDF 高级处理完全指南:pypdfium2、pdf-lib、pdfjs-dist 与命令行工具实战

本文是 [Hive 项目](https://link.gitcode.com/i/1ec139db8a44227445223c4223fc61f2) 内置 Agent Skill `hive.pdf`([SKILL.md](https://link.gitcode.com/i/5958c6ce5a204ee31ac2ff3b2ff23b8a))的进阶配套参考,以仓库中的 [REFERENCE.md

gitblog_00965的博客 743

开发高性能的MongoDB应用—浅谈MongoDB性能优化(转)

出处:http://www.cnblogs.com/mokafamily/p/4102829.html 性能与用户量     “如何能让软件拥有更高的性能?”,我想这是一个大部分开发者都思考过的问题。性能往往决定了一个软件的质量,如果你开发的是一个互联网产品,那么你的产品性能将更加受到考验,因为你面对的是广大的互联网用户,他们可不是那么有耐心的。严重点说,页面的加载速度每增加一秒也许都会使你

liyanlei的专栏 3683

MongoDB 高性能应用场景与实践

MongoDB 是一款功能强大且易于使用的数据库系统,尤其在高性能场景下表现优异。通过深入了解其特性和最佳实践,我们可以更好地利用 MongoDB 提升业务效率和数据处理能力。希望本文能为读者提供有价值的参考。版权所有 © 2023 技术博客```

2501_91226585的博客 421

开发高性能的MongoDB应用—浅谈MongoDB性能优化

性能与用户量     “如何能让软件拥有更高的性能?”,我想这是一个大部分开发者都思考过的问题。性能往往决定了一个软件的质量,如果你开发的是一个互联网产品,那么你的产品性能将更加受到考验,因为你面对的是广大的互联网用户,他们可不是那么有耐心的。严重点说,页面的加载速度每增加一秒也许都会使你失去一部分用户,也就是说,加载速度和用户量是成反比的。那么用户能够接受的加载速度到底是多少呢?

三丰的专栏 990

构建高性能应用:Java与MongoDB的完美融合

灵活的数据模型:MongoDB使用BSON(二进制JSON)格式来存储数据,允许你以非常灵活的方式存储数据,不需要严格的模式定义。这对于处理半结构化或不确定结构的数据非常有用。可扩展性:MongoDB可以轻松地水平扩展,通过添加更多的节点来应对高负载和大规模数据。高性能:MongoDB的读写性能非常出色,特别适合需要快速访问大量数据的应用。丰富的查询语言:MongoDB支持丰富的查询操作,包括范围查询、文本搜索、地理空间查询等。

赵KK的博客 1082

如何使用electron-vue + MongoDB打造高性能桌面数据管理应用:完整实战指南

electron-vue是一个基于Electron和Vue.js的桌面应用开发框架,能够帮助开发者快速构建跨平台的桌面应用程序。通过结合MongoDB数据库,我们可以打造出功能强大、性能优异的桌面级数据管理应用,实现数据的高效存储与管理。 ## 📋 准备工作:环境搭建与项目初始化 ### 1. 安装electron-vue框架 首先需要安装electron-vue框架,确保你的开发环境中已经

gitblog_00253的博客 1074

【图书推荐】《MongoDB基础、运维与性能优化》

MongoDB数据库与传统的关系型数据库不同,是一种面向文档的、介于非关系型和关系型之间的数据库。本书帮助读者掌握MongoDB 8数据库及其相关技术栈的开发知识,全书内容详实、重点突出、通俗易懂,涵盖MongoDB 8数据库应用开发的要点。本书配套PPT课件。本书共分15章,内容包括MongoDB数据库基础知识、系统安装与环境搭建、可视化工具使用、Shell工具使用、基础操作、聚合、数据模型、时间序列、事务、索引、副本集、分片、存储、安全以及性能优化。

夏天又到了的专栏 1163
上一篇: 以视频爬取实例讲解Python爬虫神器Beautiful Soup用法
下一篇: MongoDB的存储结构及对空间使用率的影响
xp5xp6
博客等级 码龄11年 99粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值