

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

# 低用量和備援索引
<a name="anti-pattern-low-used-redundant-indexes"></a>

## 概觀
<a name="low-indexes-overview"></a>

索引可改善工作負載的整體查詢效能，但會帶來成本。每個索引都會耗用儲存體和 I/O 資源，而寫入操作需要更新集合上的所有索引。如果您的資料庫包含未使用、未充分利用或備援的索引，會導致叢集額外負荷，進而降低效能。多個不必要的索引會建立反模式，造成效能問題、增加儲存成本和更高的操作開銷。

**次佳索引案例**
+ **未使用的索引**：為一次性查詢建立的索引，或在目前查詢模式不再存取的先前產品反覆運算中建立的索引。若要識別集合上未使用的索引，您可以使用 indexStats。如需詳細資訊，請參閱[如何分析索引用量並識別未使用的索引？](user_diagnostics.md#user-diag-index-usage)。
+ **備援索引**：涵蓋重疊索引鍵模式或相同查詢模式的多個索引。範例：當複合索引同時涵蓋屬性 A 和 B 時，屬性 A 上的單一索引鍵會變成備援，因為複合索引可以單獨處理屬性 A 上的查詢。
+ **過度索引**：建立索引「以防發生」而不分析實際的查詢模式或效能需求。
+ **低基數索引**：在具有幾個不同值 （例如，布林值欄位、狀態旗標） 的欄位上索引，可提供最小的查詢最佳化優勢。

## 對叢集效能的影響
<a name="low-indexes-impact"></a>
+ **儲存和 IO**：每個索引都會耗用儲存空間和 IO 資源，這有助於整體成本。如果索引未使用或備援，則表示叢集上不必要的成本。
+ **降低的寫入效能**：插入、更新和刪除操作必須維護索引，建立消耗資源的額外負荷。未使用的或備援索引會為這些操作增加不必要的額外負荷。
+ **記憶體和 CPU 壓力**：索引會競爭緩衝集區記憶體，如果工作集不適合執行個體記憶體，導致 BufferCacheHitRatio 欠佳，則可能會移出經常存取的資料。系統也會使用維護索引結構的 CPU 資源。

## 可用於識別索引最佳化機會的工具
<a name="low-indexes-tools"></a>
+ 索引檢閱工具：
+ 索引基數偵測工具

**收集工具組：**

```
git clone https://github.com/awslabs/amazon-documentdb-tools.git
```

**1。索引檢閱工具**

索引檢閱工具會分析所有集合和索引，以提供索引清單及其使用模式，並識別 Amazon DocumentDB 叢集上的備援索引。在所有叢集執行個體上執行此工具，以進行全面分析。如需詳細資訊，請參閱[索引檢閱工具](https://github.com/awslabs/amazon-documentdb-tools/tree/master/performance/index-review)。

**用量：**

```
cd performance/index-review/

python3 index-review.py --server-alias <server-alias> --uri <mongodb-uri>
```

**輸出檔案**
+ `{server-alias}-collections.csv`：集合層級統計資料
+ `{server-alias}-indexes.csv`：詳細的索引用量指標
+ `{server-alias}-{timestamp}-index-review.json`：用於進一步分析的原始資料

**注意**  
使用獨立別名對叢集中的每個執行個體執行 ，以從每個執行個體產生統計資料，然後執行 工具以取得累積分析

例如： `python3 index-review.py --files "{server-alias}-{timestamp}-index-review.json, {server-alias}-{timestamp}-index-review.json" --server-alias full-review`

**2. 索引基數偵測工具**

此工具可識別基數低且查詢效能效率不佳的索引。

**用途**

```
cd performance/index-cardinality-detection/

python3 detect-cardinality.py --uri <mongodb-uri>
```

**參數**
+ `--threshold`：基數閾值百分比 （預設值：1%)
+ `--sample-count`：要取樣的文件數量 （預設值：100，000)
+ `--max-collections`：每個資料庫要掃描的集合上限 （預設值：100)

如需詳細資訊，請參閱 https：//[https://aws.amazon.com/blogs/database/detect-and-fix-low-cardinality-indexes-in-amazon-documentdb/](https://aws.amazon.com/blogs/database/detect-and-fix-low-cardinality-indexes-in-amazon-documentdb/)

## 修復策略
<a name="low-indexes-remediation"></a>

**1。未使用和備援索引移除**

```
// Example: Drop unused index
db.collection.dropIndex("unused_index_name")
```

**注意**  
在未與所有感興趣的各方討論並測試效能之前，絕不應捨棄索引。

**2. 低基數索引最佳化**
+ 搭配篩選條件使用部分索引
+ 將單一低基數索引轉換為複合索引