关于mongodb:性能最佳实践MongoDB索引

5次阅读

共计 3358 个字符,预计需要花费 9 分钟才能阅读完成。

欢送浏览 MongoDB 性能最佳实际系列博客的第三篇。

在本系列中,咱们将探讨在大规模数据下实现高性能,须要在许多重要维度上进行思考的关键因素,其中包含:

  • 数据建模和内存大小调整(工作集)
  • 查问模式和剖析
  • 索引
  • 分片
  • 事务和读 / 写关注
  • 硬件和操作系统配置
  • 基准测试

依据咱们在过来的 15 年里为多个不同数据库供应商工作的教训,能够必定地说,如何定义适合的索引是技术支持团队必须解决的首要性能问题。

所以接下来会介绍一些有帮忙的最佳实际。

MongoDB 中的索引

在所有数据库中,索引都无效地反对查问的执行。如果没有它们,数据库就必须扫描汇合或表中的每个文档,而后在其中抉择与查问语句相匹配的那些。如果存在适合的索引,数据库就能够应用该索引来限度它必须查看的文档数量。

MongoDB 提供了十分多的索引类型和个性,包含特定于不同语言的排序功能,以反对对数据简单的拜访模式。MongoDB 索引能够按需创立和删除以适应一直变动的应用程序需要和查问模式,并且它们能够在文档中的任何字段上申明,包含嵌套在数组中的字段。

上面咱们来讨论一下如何在 MongoDB 中充沛地应用索引。

应用复合索引

复合索引是由几个不同字段组成的索引。例如,在对姓名进行查问时,相比于在“姓氏”上建设一个索引,再在“名字”上建设另一个索引,创立同时蕴含“姓”和“名”的索引通常是最无效的。而且复合索引依然能够用于筛选仅指定姓氏的查问。

遵循 ESR 规定

对于复合索引,这个教训法令对于确定索引中字段的程序是十分有帮忙的:

  • 首先,增加针对 等值(Equality)查问的字段。
  • 接下来要索引的字段应该反映出查问的 排序(Sort)程序。
  • 最初要增加的字段示意要拜访的数据的 范畴(Range)

尽可能应用笼罩查问

笼罩查问能够间接从索引返回后果,而不须要拜访源文档,因而十分高效。

想要查问被笼罩,须要过滤、排序和 / 或返回给客户端的所有字段都必须呈现在索引中。要确定一个查问是否是笼罩查问,能够应用 explain() 办法。如果 explain() 输入中 totalDocsExamined 字段显示为 0,则表明此查问被索引笼罩。更多信息请参阅文档中 explain 后果的局部。

在试图实现笼罩查问时,一个常见的问题是_id 字段总是默认返回。须要显式地将其从查问后果中排除,或将其增加到索引中。

在分片集群中,MongoDB 在外部须要拜访片键字段。这意味着仅当片键是索引的一部分时才可能进行笼罩查问。无论如何,这通常都是一个很好的形式。

在低基数字段上要小心进行索引

对于具备大量惟一值(基数低)的字段进行查问会返回较大的后果集。在复合索引中能够蕴含基数较低的字段,然而组合字段的值应该具备较高的基数。

打消不必要的索引

索引是资源密集型的:即便在 MongoDB 的 WiredTiger 存储引擎中应用压缩,它们也会耗费 RAM 和磁盘。在更新字段时,必须保护关联的索引,这会带来额定的 CPU 和磁盘 I / O 开销。

MongoDB 提供了工具来帮忙了解索引的应用,咱们将在文章前面进行介绍。

不要用通配符索引来代替基于工作负载的索引布局

对于具备许多非凡查问模式或解决高度多态文档构造的工作负载,通配符索引提供了很多额定的灵活性。能够定义一个过滤器来主动索引汇合中所有匹配的字段、子文档和数组。

与其余索引一样,通配符索引也须要存储和保护,因而它们会给数据库减少开销。如果事后晓得应用程序的查问模式,那么应该对查问所拜访的特定字段应用更有选择性的索引。

应用文本搜寻来匹配字段内的单词

惯例索引对于匹配整个字段值很有用。但如果只想匹配蕴含大量文本字段中的特定单词,那么能够应用文本索引。

如果你在 Atlas 服务中运行 MongoDB,能够思考应用 Atlas 全文搜寻,它提供了一个与 MongoDB 数据库集成的齐全托管的 Lucene 索引。FTS 提供了更高的性能和更大的灵活性来对数据进行过滤、排名及排序,为用户疾速找出最相干的后果。

应用局部索引

通过只蕴含那些会通过索引拜访的文档来缩小索引的大小和性能开销。例如,在 orderID 字段上创立一个局部索引,该索引只蕴含 orderStatus"In progress"的订单文档,或者仅为存在 emailAddress 字段的文档创立索引。

利用多键索引查问数组

如果你的查问模式须要拜访单个数组元素,请应用多键索引。MongoDB 会为数组中的每个元素创立一个索引键,并且能够同时在蕴含标量值和内嵌文档的数组上结构。

防止应用非左锚定或无根的正则表达式

索引是按值排序的。前导通配符效率较低,可能会导致全索引扫描。如果表达式中有足够的辨别大小写的前导字符,那么前面追随通配符通常效率能够比拟高。

防止应用大小写不敏感的正则表达式

如果应用正则表达式的惟一起因是大小写不敏感,请应用大小写不敏感索引,因为这样更快。

应用 WiredTiger 存储引擎中可用的索引优化

如果你应用的是自治理的 MongoDB,能够抉择在它们本人独自的卷上搁置索引,从而容许更快的磁盘分页和更少的争用。更多信息请参见 wiredTiger 选项。

应用查问打算

在上一篇查问模式和剖析中,咱们介绍了 MongoDB 的查问打算的应用,这是查看单个查问索引笼罩状况的最佳工具。

依据查问打算,MongoDB 提供了可视化工具来进一步帮忙进步对索引的了解,并提供了对于要增加哪些索引的智能倡议。

应用 MongoDB Compass 和 Atlas 数据浏览器进行索引笼罩状况的可视化

作为 MongoDB 的收费 GUI,Compass 提供了许多个性来帮忙优化查问性能,包含数据模式浏览和查问打算可视化——本系列之前的文章介绍过这两方面内容。

Compass 中的索引选项卡为你的工具库增加了另一个工具。它列出了一个汇合的现有索引,显示出索引的名称和键,以及它的类型、大小和任何非凡属性。在索引选项卡中还能够依据须要增加和删除索引。

图 1:应用 MongoDB Compass 治理索引

查看索引的应用状况是十分有用的个性,它能够显示索引的应用频率。索引过多对性能的侵害简直和索引过少是一样的,这使得此个性在帮忙辨认和删除未应用的索引方面十分有价值。这有助于开释工作集空间,并打消因为保护索引而带来的数据库开销。

如果你在齐全托管的 Atlas 服务中运行 MongoDB,那么数据浏览器中的索引视图能够提供与 Compass 雷同的性能,而无需通过独自的工具连贯到数据库。

还能够应用 $indexStats 聚合管道来获取索引的统计信息。

自动化的索引倡议

即便能够应用 MongoDB 工具提供的所有这些遥测技术,你依然要负责提取和剖析所需的数据,以决定应该增加哪些索引。

MongoDB Atlas 和 Ops Manager 通过 Performance Advisor 缩小了这方面的工作,它监控执行工夫超过 100ms 的查问,并主动对新的索引提出倡议来进步性能。

被举荐的索引会与依据查问形态分组的示例查问(即具备相似谓词构造、排序和投影的查问)一起提供,这些查问针对会从倡议索引中获益的汇合运行。Performance Advisor 不会对 Atlas 集群的性能产生负面影响。

如果你感觉这个倡议不错,那么能够主动履行新的索引,而不会导致任何的应用程序停机工夫。

接下来的内容

这就是本期的性能最佳实际系列。MongoDB University 提供收费的、基于 web 的 MongoDB 性能培训课程。这是理解更多对于索引性能的十分好的路径。


下一篇将介绍分片。

本文译自:

Performance Best Practices: Indexing

译者:牟天垒 MongoDB 中文社区翻译委员

MongoDB 性能最佳实际系列:

性能最佳实际:MongoDB 数据建模和内存大小调整

性能最佳实际:MongoDB 查问模式和剖析

MongoDB 模式构建系列:

利用模式进行构建第一讲——多态模式

利用模式进行构建第二讲——属性模式

利用模式进行构建第三讲——桶模式

利用模式进行构建第四讲——异样值模式

利用模式进行构建第五讲——计算模式

利用模式进行构建第六讲——子集模式

利用模式进行构建第七讲——扩大援用模式

利用模式进行构建第八讲——近似值模式

利用模式进行构建第九讲——树形模式

利用模式进行构建第十讲——预分配模式

利用模式进行构建第十一讲——文档版本控制模式

利用模式进行构建第十二讲——应用模式构建系列总结

正文完
 0