MongoDB性能系列最佳实践-Index

本文涉及的产品
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: MongoDB将会推出一系列介绍MongoDB性能最佳实践的文章,旨在帮助用户在多个关键方面实现规模化性能优化。

MongoDB中的索引

在任何数据库中,可以用索引支持高效执行查询。如果没有索引,数据库必须扫描集合或表中的每个文档,才能选择与查询语句匹配的文档。如果查询存在适当的索引,数据库可以使用索引来限制必须检查的文档数量,从而提升查询效率。索引的使用可以大大减少查询所需的时间和资源,让数据库能更快速地找到所需数据。因此,在设计数据库时,充分考虑并优化索引的使用,是提升数据库性能的关键一步。


MongoDB提供了丰富的索引类型和功能,并具有针对语言的排序顺序,以支持对数据的复杂访问模式。MongoDB索引可以根据应用程序的需求和查询模式随时创建和删除,并且可以声明在文档中的任何字段上,包括嵌套在数组中的字段。这些灵活的索引功能使得在MongoDB中进行高效的数据访问变得更加简单和便捷。无论是针对特定的字段还是针对文档中的嵌套字段,都可以根据实际需求来创建索引,以提升查询性能和响应时间。通过合理设计和使用索引,可以最大限度地优化MongoDB的性能,提供更好的数据访问体验。

因此,让我们讨论如何在MongoDB中最好地使用索引。


使用复合索引

复合索引是由几个不同字段组成的索引。例如,如果您对“姓氏”和“名字”都进行查询,通常最高效的做法是创建包含“姓氏”和“名字”的索引。这样的复合索引不仅可以高效地处理同时指定“姓氏”和“名字”的查询,还可以用于过滤只指定“姓氏”的查询。


遵循ESR规则

在设计复合索引时,有一个经验法则有助于确定字段的顺序:根据查询的频率和选择性,将最常用且选择性高的字段放在索引的前面。这样做可以使索引更有效地过滤数据,提高查询的性能:

在设计复合索引时,以下经验法则可以帮助您确定字段的顺序:


首先,将用于执行等值查询的字段添加到索引中。这些字段通常是经常用于查询条件的字段,例如进行精确匹配的字段。


接下来,考虑对查询结果进行排序的字段。将这些字段添加到索引中,可以使查询在排序时更加高效。


最后,将需要访问的数据范围的字段添加到索引中。这些字段可以帮助缩小索引的范围,提高查询性能。


通过遵循这个经验法则,您可以设计出更优化的复合索引,以适应不同的查询模式和需求。根据具体情况,按照等值查询字段、排序字段和数据范围字段的顺序,灵活地确定索引字段的排列,以提供更好的查询性能和响应时间。


在可能的情况下,请尽量使用覆盖查询(Covered Queries)。

覆盖查询可以直接从索引中返回结果,而无需访问源文档,因此非常高效。要确定查询是否是覆盖查询,可以使用explain()方法。如果explain()的输出显totalDocsExamined为0,说明查询是由索引覆盖的。


在尝试实现覆盖查询时,有一个常见的陷阱是_id字段默认始终返回。您需要明确地将其从查询结果中排除,或者将其添加到索引中。


在分片集群中,MongoDB内部需要访问分片键的字段。因此,只有在分片键是索引的一部分时,覆盖查询才可行。通常最好将分片键作为索引的一部分。


在考虑低基数字段上的索引时要小心

对具有少量唯一值(低基数)的字段进行查询可能会返回大的结果集。复合索引可能包含具有低基数的字段,但合并字段的值应该具有高基数。


消除不必要的索引

索引是资源密集型的:即使在MongoDB的WiredTiger存储引擎中使用压缩,它们也会消耗RAM和磁盘。此外,随着字段的更新,相关的索引也必须进行维护,这会增加额外的CPU和磁盘I/O负载。因此,我们应该谨慎评估和删除不再需要的索引。


MongoDB 还提供了工具来帮助您了解索引使用情况:


通配符索引不能替代基于工作负载的索引规划

对于具有许多临时查询模式或处理高度多态文档结构的工作负载,通配符索引提供了额外的灵活性。您可以定义一个过滤器,自动为集合中的所有匹配字段、子文档和数组创建索引。

与任何索引一样,它们也需要存储和维护,因此它们会给数据库增加开销。如果您的应用程序的查询模式事先已知,那么应该使用更有选择性的索引来处理查询访问的特定字段。


使用文本搜索来匹配字段中的单词

常规索引用于匹配字段的整个值。如果您只想在包含大量文本的字段中匹配特定单词,则应使用文本索引。


如果您在Atlas服务中运行MongoDB,请考虑使用Atlas全文搜索,它提供了一个与MongoDB数据库集成的完全托管的Lucene索引。全文搜索提供更高的性能和更大的灵活性,用于对数据库进行过滤、排序和排序,以快速呈现与用户最相关的结果。


使用部分索引

通过仅包含将通过索引访问的文档来减小索引的大小和性能开销。例如,在orderID字段上创建部分索引,只包括orderStatus为“正在进行中”的订单文档,或者仅在文档中存在emailAddress字段时创建索引。


利用多键索引查询数组

如果您的查询模式需要访问单个数组元素,请使用多键索引。MongoDB会为数组中的每个元素创建一个索引键,并且可以构建在持有标量值和嵌套文档的数组上。


避免未以左锚定或根据的正则表达式

索引按值排序。前导通配符效率低下,可能导致完整索引扫描。如果表达式中有足够的大小写敏感的前导字符,后置通配符可能是高效的。


避免大小写不敏感的正则表达式

如果使用正则表达式的唯一原因是大小写不敏感,请改用大小写不敏感索引,因为它们更快。


使用WiredTiger存储引擎中提供的索引优化

如果您自己管理MongoDB,可以将索引放在单独的卷上,从而实现更快的磁盘分页和较低的争用。有关更多信息,请参见WiredTiger选项。


使用解释计划

我们在前面的查询模式和性能分析帖子中介绍了使用MongoDB的解释计划,这是检查单个查询的索引覆盖的最佳工具。


从解释计划中工作,MongoDB提供了可视化工具,以帮助进一步改善您对索引的理解,并提供智能和自动化的建议,可添加哪些索引。


立即试用阿里云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
相关文章
|
1月前
|
存储 关系型数据库 MySQL
四种数据库对比MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景
四种数据库对比 MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景
|
3月前
|
JSON NoSQL MongoDB
MongoDB Schema设计实战指南:优化数据结构,提升查询性能与数据一致性
【8月更文挑战第24天】MongoDB是一款领先的NoSQL数据库,其灵活的文档模型突破了传统关系型数据库的限制。它允许自定义数据结构,适应多样化的数据需求。设计MongoDB的Schema时需考虑数据访问模式、一致性需求及性能因素。设计原则强调简洁性、查询优化与合理使用索引。例如,在构建博客系统时,可以通过精心设计文章和用户的集合结构来提高查询效率并确保数据一致性。正确设计能够充分发挥MongoDB的优势,实现高效的数据管理。
62 3
|
3月前
|
存储 NoSQL JavaScript
MongoDB存储过程实战:聚合框架、脚本、最佳实践,一文全掌握!
【8月更文挑战第24天】MongoDB是一款备受欢迎的文档型NoSQL数据库,以灵活的数据模型和强大功能著称。尽管其存储过程支持不如传统关系型数据库,本文深入探讨了MongoDB在此方面的最佳实践。包括利用聚合框架处理复杂业务逻辑、封装业务逻辑提高复用性、运用JavaScript脚本实现类似存储过程的功能以及考虑集成其他工具提升数据处理能力。通过示例代码展示如何创建订单处理集合并定义验证规则,虽未直接实现存储过程,但有效地演示了如何借助JavaScript脚本处理业务逻辑,为开发者提供更多实用指导。
68 2
|
3月前
|
安全 C# 数据安全/隐私保护
WPF安全加固全攻略:从数据绑定到网络通信,多维度防范让你的应用固若金汤,抵御各类攻击
【8月更文挑战第31天】安全性是WPF应用程序开发中不可或缺的一部分。本文从技术角度探讨了WPF应用面临的多种安全威胁及防护措施。通过严格验证绑定数据、限制资源加载来源、实施基于角色的权限管理和使用加密技术保障网络通信安全,可有效提升应用安全性,增强用户信任。例如,使用HTML编码防止XSS攻击、检查资源签名确保其可信度、定义安全策略限制文件访问权限,以及采用HTTPS和加密算法保护数据传输。这些措施有助于全面保障WPF应用的安全性。
51 0
|
5月前
|
NoSQL 测试技术 MongoDB
使用同步和异步方式更新插入MongoDB数据的性能对比
在这篇文章中,我将探讨如何使用同步和异步方式插入数据到MongoDB,并对两种方式的性能进行对比。并将通过Python中的 pymongo 和 motor 库分别实现同步和异步的数据插入,并进行测试和分析。
|
4月前
|
存储 NoSQL Java
使用MongoDB实现NoSQL数据库的最佳实践
使用MongoDB实现NoSQL数据库的最佳实践
|
5月前
|
NoSQL BI MongoDB
深入理解 MongoDB 条件操作符:优化查询、精准筛选、提升性能
深入理解 MongoDB 条件操作符:优化查询、精准筛选、提升性能
119 1
|
5月前
|
NoSQL 安全 MongoDB
精准数据清理:掌握 MongoDB 删除集合的方法与最佳实践
精准数据清理:掌握 MongoDB 删除集合的方法与最佳实践
184 0
|
5月前
|
存储 监控 NoSQL
MongoDB 覆盖索引查询:提升性能的完整指南
MongoDB 覆盖索引查询:提升性能的完整指南
|
5月前
|
存储 NoSQL 数据管理
MongoDB关系处理:优化数据管理、提升性能的最佳实践
MongoDB关系处理:优化数据管理、提升性能的最佳实践

相关产品

  • 云数据库 MongoDB 版