

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

# 管理 Amazon DocumentDB 索引
<a name="managing-indexes"></a>

**Topics**
+ [建立 Amazon DocumentDB 索引](#index-creation)
+ [維護 Amazon DocumentDB 索引](#maintaining-indexes)

## 建立 Amazon DocumentDB 索引
<a name="index-creation"></a>

在 Amazon DocumentDB 中建置索引需要做出許多決策：
+ 需要多快完成？
+ 當組建發生時，集合是否無法存取？
+ 可以配置多少執行個體的運算能力給組建？
+ 應該建立哪種類型的索引？

本節可協助您回答這些問題，並提供命令和監控範例，以在執行個體型叢集集合上建立 Amazon DocumentDB 索引。

### 指導方針
<a name="indexing-guidelines"></a>

下列準則包括在建立新索引時的基本限制和組態權衡：
+ **Amazon DocumentDB 版本支援** - 雖然所有 Amazon DocumentDB 版本都支援單一工作者索引，但僅在 Amazon DocumentDB 4.0、5.0 和 8.0 版上支援多個工作者索引。
+ **效能權衡** - 在索引建立程序中增加工作者數量會增加 CPU 使用率，並在 Amazon DocumentDB 資料庫的主要執行個體上讀取 IO。建立新索引所需的資源將不適用於您執行中的工作負載。
+ **彈性叢集** - Amazon DocumentDB 彈性叢集不支援平行索引。
+ **工作者數量上限** - 您可以設定的工作者數量上限取決於資料庫叢集中主要執行個體的大小。這是資料庫叢集主要執行個體上 vCPUs總數的一半。例如，您可以在具有 64 個 vCPUs 的 db.r6g.16xlarge 執行個體上執行最多 32 個工作者。
**注意**  
2xlarge 和更低的執行個體類別不支援平行工作者。
+ **最低工作者** - 您可以設定的工作者數量下限為 1。在執行個體型叢集上建立索引的預設設定為兩個工作者。不過，您可以使用「工作者執行緒」選項，將工作者數量減少為一個。這將使用單一工作者執行程序。
+ **索引壓縮** - Amazon DocumentDB 不支援索引壓縮。索引的資料大小可能大於您使用其他選項時的大小。
+ **索引多個集合** - 資料庫叢集主要執行個體上的一半 vCPUs 可用於在多個集合上執行索引建立的設定工作者。
+ **索引類型** - 如需 Amazon DocumentDB 上支援索引類型的完整說明，請參閱[此部落格文章](https://aws.amazon.com/blogs/database/how-to-index-on-amazon-documentdb-with-mongodb-compatibility/)。

### 開始使用
<a name="index-build-get-started"></a>

若要開始在集合上建立索引，請使用 `createIndexes`命令。根據預設，命令會執行兩個平行工作者，將索引建立程序的速度增加兩次。

例如，下列命令程序示範如何在文件中為「user\$1name」欄位建立索引，並將索引程序速度提高到四名工作者：

1. 在叢集上使用兩個平行工作者建立索引：

   ```
   db.runCommand({"createIndexes":"test","indexes":[{"key": {"user_name":1}, "name":"username_idx"}]})
   ```

1. 若要最佳化索引建立程序的速度，您可以使用 `db.runCommand createIndexes`命令中的「工作者執行緒」選項 (`"workers":<number>`) 來指定工作者數量。

   將程序的速度提高到四個平行工作者：

   ```
   db.runCommand({"createIndexes":"test","indexes":[{"key": {"user_name":1}, "name":"username_idx", "workers":4}]})
   ```
**注意**  
工作者數量越高，建立索引的速度就越快。不過，工作者數量越高，主要執行個體vCPUs 和讀取 IO 的負載越高。確保您的叢集已充分佈建，以處理增加的負擔，而不會降低其他工作負載。

### 索引進度狀態
<a name="index-build-status"></a>

索引建立程序的運作方式是初始化、掃描集合、排序索引鍵，最後則是透過索引建置器插入索引鍵。當您在前景執行時，此程序最多有六個階段，而在背景執行時最多有九個階段。您可以依階段檢視狀態指標，例如完成百分比、掃描的儲存區塊總數、已排序的金鑰和插入的金鑰。

使用 mongo shell 中的 `db.currentOp()`命令來監控索引程序的進度。100% 完成最後一個階段表示已成功建立所有索引：

```
db.currentOp({"command.createIndexes": { $exists : true } })
```

**注意**  
只有 Amazon DocumentDB 5.0 支援檢視索引進度狀態。

#### 索引建置類型
<a name="index-build-types"></a>

索引建置的四種類型為：
+ **前景** — 前景索引建置會封鎖所有其他資料庫操作，直到索引建立為止。Amazon DocumentDB 前景建置由五個階段組成。
+ **前景 （唯一）** — 單一文件 （唯一） 前景索引建置會封鎖其他資料庫操作，例如一般前景建置。與基本前景建置不同，唯一建置會使用額外的階段 （排序金鑰 2) 來尋找重複的金鑰。前景 （唯一） 建置由六個階段組成。
+ **背景**：背景索引建置允許在建立索引時，在前景中執行其他資料庫操作。Amazon DocumentDB 背景建置由八個階段組成。
+ **背景 （唯一）** — 單一文件 （唯一） 背景索引建置可讓其他資料庫操作在建立索引時於前景執行。與基本背景建置不同，唯一建置會使用額外的階段 （排序金鑰 2) 來尋找重複的金鑰。背景 （唯一） 建置由九個階段組成。

#### 索引建置階段
<a name="index-build-stages"></a>


| 階段 | 前景 | 前景 （唯一） | 背景介紹 | 背景 （唯一） | 
| --- | --- | --- | --- | --- | 
|  初始化  |  1  |  1  |  1  |  1  | 
|  建置索引：初始化  |  2  |  2  |  2  |  2  | 
|  建置索引：掃描集合  |  3  |  3  |  3  |  3  | 
|  建置索引：排序索引鍵 1  |  4  |  4  |  4  |  4  | 
|  建置索引：排序索引鍵 2  |    |  5  |    |  5  | 
|  建置索引：插入索引鍵  |  5  |  6  |  5  |  6  | 
|  驗證：掃描索引  |    |    |  6  |  7  | 
|  驗證：排序元組  |    |    |  7  |  8  | 
|  驗證：掃描集合  |    |    |  8  |  9  | 
+ **初始化** - createIndex 正在準備索引建置器。此階段應該非常簡短。
+ **建置索引：初始化** - 索引建置器正在準備建立索引。此階段應該非常簡短。
+ **建置索引：掃描集合** - 索引建置器正在執行集合掃描以收集索引鍵。度量單位為「區塊」。
**注意**  
如果針對索引建置設定了多個工作者，則會顯示在此階段。「掃描集合」階段是唯一在索引建置過程中使用多個工作者的階段。所有其他階段都會顯示單一工作者。
+ **建置索引：排序索引鍵 1** - 索引建置器正在排序收集的索引鍵。度量單位為「金鑰」。
+ **建置索引：排序索引鍵 2** - 索引建置器正在排序與無效元組對應的收集索引鍵。此階段僅適用於唯一索引建置。度量單位為「金鑰」。
+ **建置索引：插入索引鍵** - 索引建置器正在將索引鍵插入新索引。度量單位為「金鑰」。
+ **驗證：掃描索引** - createIndex 正在掃描索引，以尋找需要驗證的金鑰。度量單位為「區塊」。
+ **驗證：排序元組** - createIndex 正在排序索引掃描階段的輸出。
+ **驗證：掃描集合** - createIndex 正在掃描集合，以驗證前兩個階段中找到的索引鍵。度量單位為「區塊」。

#### 索引建置輸出範例
<a name="w2aac35c19b5c13c15"></a>

在下面的輸出範例中 （前景索引建置），會顯示索引建立的狀態。「訊息」欄位會指出建置的階段和完成百分比，以摘要說明建置進度。「工作者」欄位表示索引建置的該階段期間所使用的工作者數量。「進度」欄位會顯示用於計算完成百分比的實際數字。

**注意**  
Amazon DocumentDB 4.0 版不支援「currentIndexBuildName」、「msg」和「progress」欄位。

```
{
    "inprog" : [{
    … 
        "command": {
            "createIndexes": "test",
            "indexes": [{
                "v": 2,
                "key": {
                    "user_name": 1
                },
                "name": "user_name_1"
            }],
            "lsid": {
                "id": UUID(“094d0fba-8f41-4373-82c3-7c4c7b5ff13b”)
            },
            "$db": "test"
        },
        "currentIndexBuildName": user_name_1,
        "msg": "Index Build: building index number_1, stage 6/6 building index: 656860/1003520 (keys) 65%",
        "workers": 1,
        "progress": {
            "done": 656861,
            "total": 1003520
        },
    … 
    ],
 
    "ok" : 1
}
```

## 維護 Amazon DocumentDB 索引
<a name="maintaining-indexes"></a>

**Topics**
+ [索引膨脹](#db-index-bloat)
+ [使用 的索引維護 `reIndex`](#reIndex)

### 索引膨脹
<a name="db-index-bloat"></a>

Amazon DocumentDB 使用多版本並行控制 (MVCC) 來管理並行交易。刪除或更新文件時，其先前的版本會保留在集合和索引中為「無效」版本。垃圾收集程序會自動從這些無效版本回收空間，以供未來操作使用。

當集合的索引因為頁面中累積無效或過時的索引項目或分段而變大時，就會發生索引膨脹。報告的百分比代表未來索引項目可以使用的索引空間量。此膨脹會耗用緩衝區快取和儲存體中的空間。如果您想要移除膨脹，則需要重建索引。

**Example 範例**  
執行下列命令來判斷索引的未使用儲存：  

```
db.coll.aggregate({$indexStats:{}});
```
結果如下所示：  

```
{ 
    "name" : "_id_",
    "key" : { 
        "_id" : 1 
    },
    "host" : "devbox-test.localhost.a2z.com:27317",
    "size" : NumberLong(827392),
    "accesses" : {
        "ops" : NumberLong(40000),
        "docsRead" : NumberLong(46049),
        "since" : ISODate("2025-04-03T21:44:51.251Z") 
    },
    "cacheStats" : {
        "blksRead" : NumberLong(264),
        "blksHit" : NumberLong(140190),
        "hitRatio" : 99.8121
    }, 
    "unusedStorageSize" : {
        "unusedSizeBytes" : 409600,
        "unusedSizePercent" : 49.51
    }
}
```

您可以使用 `reIndex`命令重建索引，而不需要停機，這需要掃描整個集合。請參閱 [使用 的索引維護 `reIndex`](#reIndex)。

### 使用 的索引維護 `reIndex`
<a name="reIndex"></a>

`reIndex` 是用來重建索引的命令。通常在索引損毀或效率不佳時使用。隨著時間的推移，索引可能會因為許多更新、插入或刪除而累積未使用的空間，導致效能降低。重新索引有助於移除這類未使用的空間，並還原索引的效率。

#### `reIndex` 準則
<a name="w2aac35c19b7b7b5"></a>
+ `reIndex` 僅支援 Amazon DocumentDB 5.0。
+ Amazon DocumentDB 支援背景中的`reindex`單一索引，允許多個工作者。程序`reIndex`執行時，查詢可以使用舊索引。
+ Amazon DocumentDB 支援透過 編製進度報告的索引`currentOp`。您可以看到索引建置階段，類似於在索引建立期間[索引建置階段](#index-build-stages)檢視的 。唯一的差別是， `reIndex`一律有八個階段，無論其是否為唯一。沒有「建置索引：排序索引鍵 2」階段。
+ `reIndex` 可與相同集合上的索引相關命令以外的任何命令同時執行：`createIndexes`、`collMod`、 `dropIndexes`和 `renameCollection`。
+ `reIndex` 目前不支援文字、地理空間、向量和部分索引。

##### `reIndex` 組建
<a name="w2aac35c19b7b7b5b5"></a>

使用下列命令來重建索引：

```
db.runCommand({ reIndex: "collection-name", index: "index-name"})
```

您也可以選擇性地控制指派給重建程序的工作者數量：

```
db.runCommand({ reIndex: "collection-name", index: "index-name", workers: number })
```