本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
性能改进技巧
本节为 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 成本,提高查询性能
注意
4. 利用索引实现最佳查询性能
确保您的查询始终使用索引以获得最佳性能。亚马逊 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 */] }
性能提升:较小的文档意味着更快的更新、更少的内存使用和更高的缓存效率。
影响:数据建模效率低下会导致查询次优化、文档大小增加和内存使用量增加,从而导致应用程序性能下降和运营成本增加。