

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 效能改善秘訣
<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 成本。

**Impact: (影響：)**
+ 更多文件適用於可用的記憶體
+ 減少磁碟讀取，加快資料存取速度
+ 降低儲存成本、I/O 成本並改善查詢效能

**注意**  
Amazon DocumentDB 預設不會為 5.0 版啟用壓縮。您可以在 5.0 叢集的集合或叢集層級[啟用壓縮](doc-compression.md)。使用 Amazon DocumentDB 的壓縮檢閱公用程式來分析集合的壓縮比率。  
對於 Amazon DocumentDB 8.0，[預設會啟用壓縮](dict-compression.md)。

## 4. 利用索引獲得最佳查詢效能
<a name="tip-leverage-indexes"></a>

確保您的查詢一律使用索引來獲得最佳效能。Amazon DocumentDB 提供多種索引類型，以符合不同的使用案例。

**索引原則：**
+ 每個查詢都應利用適當的索引
+ Amazon DocumentDB 提供多種[索引類型](index-types.md)
+ 複合索引支援具有單一索引的各種查詢形狀，可提供最大的彈性
+ 設計索引以同時支援排序和篩選操作

**了解索引字首：**複合索引適用於索引字首 - Amazon DocumentDB 可以使用索引欄位的任何left-to-right子集。例如，索引會`{ category: 1, price: -1, inStock: 1 }`建立這些可用的字首：
+ `{ category: 1 }` - 僅支援依類別篩選的查詢
+ `{ category: 1, price: -1 }` - 支援依類別篩選查詢，以及依價格排序/篩選
+ `{ category: 1, price: -1, inStock: 1 }` - 支援完整的複合查詢

價格、inStock 或 inStock 的查詢不會使用此索引，因為它們不是以第一個欄位 （類別） 開頭。

**如何識別未使用索引的查詢：**使用 explain() 方法來分析查詢執行，並識別執行集合掃描的查詢，而不是使用索引。

**影響：**沒有索引使用率的查詢會導致集合掃描，導致執行個體的記憶體和 CPU 壓力增加，以及查詢延遲增加。

## 5. 根據查詢模式最佳化資料模型
<a name="tip-optimize-data-models"></a>

讓您的資料模型與您的應用程式查詢和更新資料的方式保持一致。資料建模是高效能 Amazon DocumentDB 應用程式的基礎。

**最佳化策略：**

**效能內嵌**
+ 經常以單位形式存取相關資料時，請將相關資料存放在一起
+ 一律一起擷取的內嵌文件
+ 適合one-to-few的關係

```
// 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" }
  ]
}
```

**彈性參考**
+ 使用大型或不常存取資料的參考
+ 建議與大型資料集建立one-to-many關係
+ 防止文件膨脹並改善更新效能

**集合分割策略**

當大型文件中只有幾個欄位經常更新時，或當大型不常存取的資料膨脹文件時，請考慮分割集合：
+ 在個別、較小的集合中保留經常更新的欄位
+ 在另一個集合中存放靜態或不常存取的資料
+ 視需要將它們與參考連結

```
// 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 */]
}
```

**效能提升：**較小的文件表示更新速度更快、記憶體使用率降低，以及快取效率提升。

**影響：**低效率的資料建模會導致查詢不佳、文件大小增加和記憶體用量增加，進而降低應用程式效能並提高營運成本。