mongoDB 性能优化

文章目录

  • 前言
    • [mongoDB 性能优化](#mongoDB 性能优化)
      • [1. explain方法来查看查询的执行计划](#1. explain方法来查看查询的执行计划)
      • [2. 查看mongoDB 集合的索引](#2. 查看mongoDB 集合的索引)
      • [3. mongoDB 怎么添加索引](#3. mongoDB 怎么添加索引)
      • [4. 升序索引与降序索引是什么意思](#4. 升序索引与降序索引是什么意思)

前言

如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。

而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


mongoDB 性能优化

1. explain方法来查看查询的执行计划

使用explain方法来查看查询的执行计划。explain方法提供了关于查询性能的详细信息,包括查询使用的索引、文档的扫描数量等。

sql 复制代码
db.collection.find(query).explain("executionStats")

executionStats参数告诉MongoDB只返回执行统计信息。

示例:

执行上述查询后,MongoDB会返回一个包含执行计划信息的文档。你可以查看该文档来分析查询的性能。

  • plannerVersion: 查询规划器的版本。
  • namespace: 查询的命名空间(数据库和集合)。
  • executionSuccess: 指示查询是否成功执行。
  • nReturned: 返回的文档数量。
  • executionTimeMillis: 查询的执行时间(以毫秒为单位)。
  • winningPlan,它提供了MongoDB选择的执行计划的详细信息,包括使用的索引、扫描的文档数量等。
    winningPlan是MongoDB查询执行计划中的一个关键部分,它描述了MongoDB选择的执行计划,包括使用的索引、查询策略等。分析winningPlan可以帮助你了解MongoDB是如何执行查询的,以便更好地优化查询性能。
    以下是一些常见的要点,可以帮助你分析winningPlan:
  1. 查询的阶段(Stage): winningPlan中的stage字段描述了MongoDB执行查询的主要阶段。常见的阶段包括COLLSCAN(集合扫描)、IXSCAN(索引扫描)、FETCH(从索引中获取文档)等。了解查询的主要阶段有助于确定查询性能的瓶颈。
  2. 索引使用: 如果winningPlan中的阶段是IXSCAN,表示MongoDB正在使用一个或多个索引来执行查询。你可以查看winningPlan中的inputStage字段,以了解使用的具体索引。优化索引的选择和使用可以显著提高查询性能。
  3. 筛选条件: winningPlan中的filter字段描述了用于筛选文档的条件。这可以帮助你确定MongoDB是否有效地使用索引来减少文档扫描的数量。
  4. 索引覆盖: 如果winningPlan中的阶段是FETCH,表示MongoDB在索引扫描后需要额外的步骤来获取文档。优化查询性能的一种方式是尽量让索引覆盖查询,即索引本身包含了查询所需的字段,而无需额外获取文档。
  5. 文档数量: winningPlan中通常包括有关查询返回的文档数量的信息,如nReturned。这对于评估查询的效率和性能至关重要。
  6. 排序和限制: 如果查询中包括排序和限制条件,winningPlan中也会包含这些信息。排序和限制条件可能会影响查询性能,特别是如果没有适当的索引支持。
  7. 索引覆盖: 查询计划中的 indexOnly 指示是否使用了索引覆盖,即查询结果是否可以完全从索引中获取,而无需额外的文档检索。索引覆盖可以显著提高查询性能。
  8. 其他信息: winningPlan中可能还包含其他信息,例如direction字段用于表示索引扫描的方向(正向或反向),以及其他执行计划相关的信息。
    综合分析上述信息,你可以确定查询性能的瓶颈,并采取相应的优化措施,例如创建合适的索引、调整查询条件、减少文档扫描等,以提高查询的效率和性能。请注意,分析查询计划可能需要一定的经验,特别是在复杂的查询场景中,但它是优化MongoDB查询性能的关键步骤。

2. 查看mongoDB 集合的索引

sql 复制代码
use your_database 
db.myCollection.getIndexes()

示例:

  1. key: 这部分指示了索引的字段和排序方式。在你的示例中,"_id": 1 表示这个索引是基于 _id 字段创建的,而 1 表示按升序排序。MongoDB默认为每个集合创建一个唯一索引,用于快速查找文档。
  2. name: 这是索引的名称。在你的示例中,索引名称是 "id",这是默认的命名规则,通常是字段名加下划线。
  3. ns: 这是索引所属的命名空间。在你的示例中,索引属于 "scfop-api-partner" 数据库中的 "dataSyncRequestVO" 集合。
  4. v: 这是索引版本的信息。在你的示例中,版本号为 2,这表示索引是MongoDB的版本2索引格式。
    总结来说,这个输出告诉你在 "scfop-api-partner" 数据库的 "dataSyncRequestVO" 集合上存在一个名为 "id" 的索引,它是一个升序索引,用于加速对 _id 字段的查找。这个索引通常是自动生成的,以确保每个文档都有唯一的 _id 值,这是MongoDB文档的默认主键。

3. mongoDB 怎么添加索引

使用db.collection.createIndex()方法来创建索引。这个方法用于在指定集合上创建一个或多个索引。

这将在名为 "yourCollection" 的集合上创建一个基于 "yourField" 字段的升序索引。

sql 复制代码
db.yourCollection.createIndex({ yourField: 1 });

创建多个单索引:

sql 复制代码
db.yourCollection.createIndexes([{'yourField':1},{'yourField':1},{'yourField':1}])

如果你想创建一个复合索引(多个字段的组合索引),可以传递一个包含多个字段和排序方式的对象:

sql 复制代码
db.yourCollection.createIndex({ field1: 1, field2: -1 });

这将在名为 "yourCollection" 的集合上创建一个基于 "field1" 字段升序和 "field2" 字段降序的复合索引。

你也可以指定其他选项来定制索引,例如唯一索引、稀疏索引等。这些选项可以作为第二个参数传递给 createIndex() 方法。

sql 复制代码
db.yourCollection.createIndex({ yourField: 1 }, { unique: true, sparse: true });

在这个例子中,我们创建了一个唯一索引,该索引只包含具有 "yourField" 字段的文档,并且该字段可以有缺失值(稀疏索引)。
记得在使用索引前,要考虑你的数据模型、查询模式和性能需求来选择合适的索引策略。索引可以显著提高查询效率,但不当使用也可能会导致资源浪费和性能下降。

4. 升序索引与降序索引是什么意思

升序索引(Ascending Index):

升序索引是最常见的索引类型,也是MongoDB默认创建的索引类型。在升序索引中,索引键的值按照从小到大(A到Z、0到9)的顺序排序。升序索引在排序字段上提供了高效的查询性能,因为它使得MongoDB可以快速定位和遍历索引,尤其是在范围查询(例如 g t 、 gt、 gt、lt)和排序操作中。

在MongoDB中,如果你创建一个索引而没有明确指定排序方式,MongoDB将默认使用升序索引。

例如,以下命令将创建一个基于字段 fieldName 的升序索引:

sql 复制代码
db.collection.createIndex({ fieldName: 1 });

降序索引(Descending Index):

降序索引与升序索引相反,它按照从大到小(Z到A、9到0)的顺序排序索引键的值。降序索引在某些查询场景中也可以提供性能优势,尤其是在需要按照字段降序排序的查询操作中。

你可以通过将字段的排序方式设置为 -1 来创建一个降序索引。例如:

sql 复制代码
db.collection.createIndex({ fieldName: -1 });

这将创建一个基于 fieldName 字段的降序索引。

需要注意的是,使用降序索引可能会增加索引的维护成本,因为MongoDB需要额外的空间和计算来维护降序索引。因此,在选择索引排序方式时,需要根据实际的查询需求和性能测试结果来决定。

相关推荐
BigByte18 小时前
我用 6 个 WASM 编码器干掉了 Canvas.toBlob(),图片压缩率直接提升 15%
性能优化·webassembly·图片资源
李广坤19 小时前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
DemonAvenger2 天前
Kafka性能调优:从参数配置到硬件选择的全方位指南
性能优化·kafka·消息队列
桦说编程2 天前
实战分析 ConcurrentHashMap.computeIfAbsent 的锁冲突问题
java·后端·性能优化
爱可生开源社区2 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
AI全栈实验室2 天前
MongoDB迁移金仓踩了5个坑,最后一个差点回滚
mongodb
随逸1772 天前
《从零搭建NestJS项目》
数据库·typescript
加号33 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏3 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐3 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端