欢迎阅读MongoDB性能最佳实践系列博客的第三篇。
在本系列中,我们将讨论在大规模数据下实现高性能,需要在许多重要维度上进行考虑的关键因素,其中包括:
-
索引
-
分片
-
事务和读/写关注
-
硬件和操作系统配置
-
基准测试
根据我们在过去的15年里为多个不同数据库供应商工作的经验,可以肯定地说,如何定义合适的索引是技术支持团队必须解决的首要性能问题。
所以接下来会介绍一些有帮助的最佳实践。
MongoDB中的索引
在所有数据库中,索引都有效地支持查询的执行。如果没有它们,数据库就必须扫描集合或表中的每个文档,然后在其中选择与查询语句相匹配的那些。如果存在合适的索引,数据库就可以使用该索引来限制它必须检查的文档数量。
MongoDB提供了非常多的索引类型和特性,包括特定于不同语言的排序功能,以支持对数据复杂的访问模式。MongoDB索引可以按需创建和删除以适应不断变化的应用程序需求和查询模式,并且它们可以在文档中的任何字段上声明,包括嵌套在数组中的字段。
下面我们来讨论一下如何在MongoDB中充分地使用索引。
使用复合索引
复合索引是由几个不同字段组成的索引。例如,在对姓名进行查询时,相比于在“姓氏”上建立一个索引,再在“名字”上建立另一个索引,创建同时包含“姓”和“名”的索引通常是最有效的。而且复合索引仍然可以用于筛选仅指定姓氏的查询。
遵循ESR规则
对于复合索引,这个经验法则对于确定索引中字段的顺序是非常有帮助的:
-
首先,添加针对等值(Equality)查询的字段。
-
接下来要索引的字段应该反映出查询的排序(Sort)顺序。
-
最后要添加的字段表示要访问的数据的范围(Range)。
尽可能使用覆盖查询
覆盖查询可以直接从索引返回结果,而不需要访问源文档,因此非常高效。
想要查询被覆盖,需要过滤、排序和/或返回给客户端的所有字段都必须出现在索引中。要确定一个查询是否是覆盖查询,可以使用explain()