欢迎阅读MongoDB性能最佳实践系列博客的第二篇。在本系列中,我们将讨论在大规模数据下实现高性能,需要在许多重要维度上进行考虑的关键因素,其中包括:
- 数据建模和内存大小调整(工作集)
- 查询模式和分析
- 索引
- 分片
- 事务和读/写关注
- 硬件和操作系统配置
- 基准测试
设计正确的查询模式以及分析查询行为对于应用程序的顺利运行至关重要。此类分析对选择最合适的索引也有帮助。我们将在本系列的下一篇文章中介绍索引。
使用最新的驱动程序
MongoDB的驱动程序是由开发核心数据库的同一个团队设计的。驱动程序的更新比数据库本身更频繁,通常每几个月会更新一次。如果可能,请始终使用最新版本的驱动程序,并安装适用于你所使用语言的本机扩展。可以为测试和升级驱动程序开发一个标准的流程,这样升级就自然而然地成为流程的一部分了。
所有MongoDB驱动程序的列表,以及文档和源代码都可以在这里找到。你还应该加入MongoDB社区邮件列表来跟踪更新。
避免创建过大的无边界的文档
正如本系列文章第一部分数据建模中所述,MongoDB文档的大小最大为16MB。在实际使用中,大多数文档都是几KB或更少。
你应该避免使用那些允许文档无限增长的应用程序模式。例如,在电子商务应用中,很难估计每个产品可能收到多少客户评论。通常,只有一部分评论会显示给客户,例如那些最流行的或最近的评论。
相比于将产品及所有评论作为一个单一的文档进行建模,一个更好的方式是将一部分评论存储在产品文档中,以实现最快的访问。其他不太相关的评论可以通过对产品文档的引用或$lookup存储在单独的文档中。我们在本系列上一篇文章中提供了一些更详尽的资源,包括了基于使用场景进行数据建模的最佳实践。
仅对更改的字段进行更新
仅对特定的字段进行更新,而不是在应用中获取整个文档、更新字段,然后再将文档存回数据库。这样可以减少网络使用量及数据库的开销。
在一次操作中更新多个数组元素
通过在数组更新操作中进行完整的描述,可以在单个的更新操作中完成对数组中所匹配的元素(包括内嵌数组中的元素)执行全部复杂的操作。使用arrayFilters选项,执行更新操作时可以在数组字段中指定要修改的元素。
使用MongoDB Atlas Analytics节点
如果应用程序执行复杂或长时间运行的操作(如报表生成或ETL),则可能需要将分析查询与其他工作负载隔离开来。通过隔离不同的工作负载,可以确保不同类型的查询不会争用系统资源,从而避免分析查询刷新掉RAM中的工作集。
你可以通过单独连接到专门的分析节点来实现工作负载隔离。那些可视化工具,如MongoDB Charts可以配置为仅从分析节点进行读取。
如果是在自己的基础设施上运行MongoDB,那么可以配置副本集标签以实现与Atlas Analytics节点相同的读取隔离。
使用查询计划进行分析
MongoDB的explain()方法可以让你对应用程序发起的查询进行测试,展示一个查询是如何或将要如何被执行的相关信息,包括:
- 那些索引会被使用
- 查询是否能被索引覆盖
- 是否会执行内存排序,这表示可以通过建立索引获得收益
- 所扫描的索引项数量
- 所返回的以及读取的文档数量
- 执行查询需要花费的毫秒时间
- 有哪些可替代的查询计划被否决了(使用
allPlansExecution
模式时)
如果查询在不到1毫秒内被完成,那么查询计划会显示0毫秒,这通常说明查询被调整的很好。
MongoDB Compass GUI可以对查询计划进行可视化输出,使你更容易地识别并解决性能问题。
图1:MongoDB Compass 将查询计划可视化输出
你可以将查询计划以树状的方式进行显示,或者也可以查看完整的原始JSON输出。文档中有更多关于Compass可视化查询计划的细节。
使用MongoDB查询分析器
MongoDB查询分析器通过直接在Atlas UI中显示慢查询(默认情况下,超过100毫秒的查询)及其关键性能统计信息来暴露性能问题。
图表提供了该信息的高级视图,便于快速识别异常值和总体趋势,而表格按照命名空间(数据库和集合)和操作类型提供操作统计信息。你可以选择指标进行筛选并列出操作。这包括操作执行时间、所扫描到的文档与返回的比率、是否使用了索引、是否进行了内存排序等等。可以对所显示的操作来选择特定的时间范围,从过去的15分钟到24个小时。
图2:MongoDB Atlas 查询分析器
一旦确定了哪些操作可能存在问题,查询分析器允许你深入挖掘操作级别的统计信息,以便更深入地了解正在发生的事情。你可以在相似操作的上下文中查看特定操作的细粒度信息,这可以帮助你确定需要进行哪些常规优化来提高性能。Atlas查询分析器在使用时没有额外的费用或性能上的开销。
如果你正在本地运行MongoDB,那么作为MongoDB Enterprise Advanced一部分的Ops Manager同样包含了一个查询分析器。
其他工具和使用程序
- MongoDB数据库分析器会对一个正在运行的mongod实例上执行的操作及命令的详细信息进行收集。分析器收集的所有数据都将写入system.profile集合。这是一个位于admin数据库中的有上限集合(capped collection),你可以对其进行查询以获取更深入的信息,还可以根据要分析数据的粒度配置日志记录级别。
- mtools包含了一组辅助脚本工具,用于解析、过滤和可视化MongoDB日志文件。mloginfo可以对每个集合的查询进行分析并对共同的查询模式进行分组,以帮助你确定哪些查询在聚合中消耗了最多的资源。我们将在下一篇文章中详细介绍索引。
查看MongoDB监控文档以获得有关实用程序和第三方工具的完整描述。
接下来的内容
这就是本期的性能最佳实践系列。MongoDB University提供免费的、基于web的MongoDB性能培训课程。这是了解有关优化查询模式更多信息的非常好的途径。
下一篇将介绍索引。
本文译自:
Performance Best Practices: Query Patterns and Profiling
译者:牟天垒 MongoDB中文社区翻译委员