View a markdown version of this page

性能改进技巧 - Amazon DocumentDB

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

性能改进技巧

本节为 Amazon DocumentDB 提供了五种性能优化策略,以提高应用程序效率和查询执行。

1. 使用 $match 作为聚合管道的第一阶段

始终将 $match 作为聚合管道中筛选的第一阶段,以最大限度地提高性能。当 $match 处于领先地位时,Amazon DocumentDB 将有效地利用索引,从而使数据库能够尽早筛选数据并减少处理开销。

// Optimized approach db.orders.aggregate([ { $match: { status: "active", category: "electronics" } }, // Index utilization { $group: { _id: "$category", total: { $sum: "$price" } } }, { $sort: { total: -1 } } ])

影响:早期筛选减少了后续管道阶段处理的文档数量,从而加快了查询执行速度并降低了资源消耗。

2. 在聚合管道中使用 $project 来最小化管道数据大小

在聚合管道阶段仅传送基本字段,以最大限度地减少数据大小并提高性能。策略性地使用 $project 来仅包含您需要的数据。

// Efficient pipeline design db.orders.aggregate([ { $match: { orderDate: { $gte: new Date("2024-01-01") } } }, { $project: { customerId: 1, totalAmount: 1, status: 1 } }, // Only needed fields { $group: { _id: "$customerId", totalSpent: { $sum: "$totalAmount" } } } ])

影响:较小的文档可减少内存使用量并提高管道处理效率,从而增强整体查询性能。

3. 启用文档压缩以降低存储 I/O 成本、成本并提高查询性能

启用集群参数组中的文档压缩,以降低存储成本和 I/O 成本,并提高查询性能。Amazon DocumentDB 将压缩后的文档存储在磁盘和 RAM 中,从而减少了内存占用和 I/O 成本。

影响:

  • 可用存储器中可容纳更多文档

  • 通过减少磁盘读取次数,加快数据访问速度

  • 降低存储成本和 I/O 成本,提高查询性能

注意

默认情况下,亚马逊 DocumentDB 不为版本 5.0 启用压缩。您可以在 5.0 集群的集合或集群级别启用压缩。使用 Amazon DocumentDB 的压缩查看工具来分析您的馆藏的压缩率。

对于 Amazon DocumentDB 8.0,默认启用压缩

4. 利用索引实现最佳查询性能

确保您的查询始终使用索引以获得最佳性能。亚马逊 DocumentDB 提供多种索引类型来匹配不同的用例。

索引原理:

  • 每个查询都应利用适当的索引

  • 亚马逊 DocumentDB 提供多种索引类型

  • 复合索引通过单个索引支持各种查询形状,从而提供了最大的灵活性

  • 设计索引以同时支持排序和筛选操作

了解索引前缀:复合索引通过索引前缀起作用——Amazon DocumentDB 可以使用索引字段中从左到右的任何子集。例如,该索引{ category: 1, price: -1, inStock: 1 }创建了以下可用的前缀:

  • { category: 1 }-仅支持按类别筛选查询

  • { category: 1, price: -1 }-支持按类别和 sorting/filtering 价格筛选查询

  • { category: 1, price: -1, inStock: 1 }-支持完整复合查询

仅针对价格、InStock 或 InStock 的查询不会使用此索引,因为它们不是从第一个字段(类别)开头。

如何识别不使用索引的查询:使用 explain () 方法来分析查询执行情况,并识别执行集合扫描而不是使用索引的查询。

影响:未使用索引的查询会导致集合扫描,从而增加实例的内存和 CPU 压力,并延长查询延迟。

5. 根据查询模式优化数据模型

使您的数据模型与应用程序查询和更新数据的方式保持一致。数据建模是高性能 Amazon DocumentDB 应用程序的基础。

优化策略:

为提高性能而嵌入

  • 当经常作为一个单元访问相关数据时,将其存储在一起

  • 嵌入始终一起检索的文档

  • 适合一对几的关系

// Embedded approach for frequently accessed data { _id: ObjectId("..."), customerName: "John Doe", address: { street: "123 Main St", city: "Seattle", zipCode: "98101" }, recentOrders: [ { orderId: "ORD001", amount: 99.99, date: "2024-01-15" } ] }

灵活性参考

  • 对大型数据或不常访问的数据使用引用

  • 建议用于具有大型数据集的一对多关系

  • 防止文档膨胀并提高更新性能

馆藏拆分策略

当大型文档中只有几个字段经常更新,或者不经常访问的大型数据使文档膨胀时,可以考虑拆分集合:

  • 将经常更新的字段保存在一个单独的、较小的集合中

  • 将静态或不常访问的数据存储在另一个集合中

  • 需要时将它们与参考文献联系起来

// Before: Large document with mixed access patterns { _id: ObjectId("..."), productId: "PROD123", name: "Wireless Headphones", // Frequently accessed price: 99.99, // Frequently accessed inventory: 45, // Updated frequently lastSold: "2024-01-15", // Updated frequently detailedSpecs: { /* large object */ }, // Infrequently accessed manualPDF: "base64...", // Large, rarely accessed reviewHistory: [/* large array */] // Infrequently accessed } // After: Split into collections based on access patterns // products collection (frequently accessed data) { _id: ObjectId("..."), productId: "PROD123", name: "Wireless Headphones", price: 99.99, inventory: 45, lastSold: "2024-01-15" } // product_details collection (infrequently accessed data) { _id: ObjectId("..."), productId: "PROD123", // Reference to products collection detailedSpecs: { /* large object */ }, manualPDF: "base64...", reviewHistory: [/* large array */] }

性能提升:较小的文档意味着更快的更新、更少的内存使用和更高的缓存效率。

影响:数据建模效率低下会导致查询次优化、文档大小增加和内存使用量增加,从而导致应用程序性能下降和运营成本增加。