

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

# 性能改进技巧
<a name="performance-improvement-tips"></a>

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

## 1. 使用 $match 作为聚合管道的第一阶段
<a name="tip-match-first-stage"></a>

始终将 $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 来最小化管道数据大小
<a name="tip-project-minimize-data"></a>

在聚合管道阶段仅传送基本字段，以最大限度地减少数据大小并提高性能。策略性地使用 $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 成本、成本并提高查询性能
<a name="tip-document-compression"></a>

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

**影响：**
+ 可用存储器中可容纳更多文档
+ 通过减少磁盘读取次数，加快数据访问速度
+ 降低存储成本和 I/O 成本，提高查询性能

**注意**  
默认情况下，亚马逊 DocumentDB 不为版本 5.0 启用压缩。您可以在 5.0 集群的集合或集群级别[启用压缩](doc-compression.md)。使用 Amazon DocumentDB 的压缩查看工具来分析您的馆藏的压缩率。  
对于 Amazon DocumentDB 8.0，[默认启用压缩](dict-compression.md)。

## 4. 利用索引实现最佳查询性能
<a name="tip-leverage-indexes"></a>

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

**索引原理：**
+ 每个查询都应利用适当的索引
+ [亚马逊 DocumentDB 提供多种索引类型](index-types.md)
+ 复合索引通过单个索引支持各种查询形状，从而提供了最大的灵活性
+ 设计索引以同时支持排序和筛选操作

**了解索引前缀：**复合索引通过索引前缀起作用——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. 根据查询模式优化数据模型
<a name="tip-optimize-data-models"></a>

使您的数据模型与应用程序查询和更新数据的方式保持一致。数据建模是高性能 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 */]
}
```

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

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