

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 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 でのみサポートされています。
+ **パフォーマンスのトレードオフ**: インデックス作成プロセスのワーカー数を増やすと、Amazon DocumentDB データベースのプライマリインスタンスの CPU 使用率と読み取り IO が増加します。新しいインデックスを作成するのに必要なリソースは、実行中のワークロードでは使用できなくなります。
+ **Elastic クラスター**: Amazon DocumentDB Elastic クラスターでは並列インデックスはサポートされていません。
+ **最大ワーカー**: 設定できるワーカーの最大数は、データベースクラスター内のプライマリインスタンスのサイズによって異なります。これは、データベースクラスターのプライマリインスタンスにある vCPU の総数の半分です。たとえば、64 個の vCPU を備えた db.r6g.16xlarge インスタンスでは、最大 32 ワーカーを実行できます。
**注記**  
並列ワーカーは 2xlarge 以下のインスタンスクラスではサポートされていません。
+ **最小ワーカー**: 設定できるワーカーの最小数は 1 です。インスタンスベースのクラスターでのインデックス作成のデフォルト設定は 2 ワーカーです。ただし、「ワーカースレッド」オプションを使用すると、ワーカーの数を 1 つに減らすことができます。これはプロセスが 1 つのワーカーで実行されます。
+ **インデックス圧縮**: Amazon DocumentDB はインデックス圧縮をサポートしていません。インデックスのデータサイズは、他のオプションを使用したときより大きくなる可能性があります。
+ **複数コレクションのインデックス作成**: データベースクラスターのプライマリインスタンスにある vCPU の半分を、複数のコレクションでインデックス作成を実行する設定済みワーカーに使用できます。
+ **インデックスタイプ**: 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` コマンドを使用します。デフォルトでは、このコマンドは 2 つの並列ワーカーを実行するため、インデックス作成プロセスの速度が 2 倍向上します。

たとえば、次のコマンドプロセスは、ドキュメント内の「user\$1name」フィールドのインデックスを作成し、インデックス作成プロセスの速度を 4 ワーカーに上げる方法を示しています。

1. クラスター上の 2 つの並列ワーカーを使用してインデックスを作成します。

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

1. インデックス作成プロセスの速度を最適化するため、`db.runCommand createIndexes` コマンドの「ワーカースレッド」オプション (`"workers":<number>`) を使用してワーカー数を指定できます。

   プロセスの速度を 4 つの並列ワーカーに上げます。

   ```
   db.runCommand({"createIndexes":"test","indexes":[{"key": {"user_name":1}, "name":"username_idx", "workers":4}]})
   ```
**注記**  
ワーカーの数が増えるほど、インデックスの作成が速くなります。ただし、ワーカーの数が増えるほど、プライマリインスタンスの vCPU と読み取り IO のロードも大きくなります。他のワークロードを低下させることなく、増加したロードを処理できるよう、クラスターが十分にプロビジョニングされていることを確認してください。

### インデックスの進捗状況
<a name="index-build-status"></a>

インデックス作成プロセスは、初期化、コレクションのスキャン、キーのソート、そして最後にインデックスビルダーによるキーの挿入によって行われます。このプロセスは、フォアグラウンドで実行する場合は最大 6 段階、バックグラウンドで実行する場合は最大 9 段階に分かれます。完了率、スキャンされたストレージブロックの総数、ソートされたキー、挿入されたキーなどのステータスメトリックをステージごとに表示できます。

mongo シェルの `db.currentOp()` コマンドを使用して、インデックス作成プロセスの進行状況をモニタリングします。最後の段階が 100% 完了すると、すべてのインデックスが正常に作成されたことがわかります。

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

**注記**  
インデックス作成の進行状況の表示は、Amazon DocumentDB 5.0 でのみサポートされています。

#### インデックスビルドのタイプ
<a name="index-build-types"></a>

インデックスビルドには次の 4 つのタイプがあります。
+ **フォアグラウンド** — フォアグラウンドインデックスビルドは、インデックスが作成されるまで、他のすべてのデータベース操作をブロックします。Amazon DocumentDB フォアグラウンドビルドは 5 つのステージで構成されています。
+ **フォアグラウンド (単一)** — 単一ドキュメント (単一) フォアグラウンドインデックスビルドは、通常のフォアグラウンドビルドのような他のデータベース操作をブロックします。基本的なフォアグラウンドビルドとは異なり、単一ビルドでは追加のステージ (ソートキー 2) を使用して重複キーを探します。フォアグラウンド (単一) ビルドは 6 つのステージで構成されます。
+ **バックグラウンド** — バックグラウンドでのインデックス構築により、インデックスの作成中に他のデータベース操作をフォアグラウンドで実行できます。Amazon DocumentDB バックグラウンドビルドは 8 つのステージで構成されています。
+ **バックグラウンド (単一) ** — 単一ドキュメント (単一) のバックグラウンドインデックス構築により、インデックスの作成中に他のデータベース操作をフォアグラウンドで実行できます。基本的なバックグラウンドビルドとは異なり、単一ビルドでは追加のステージ (ソートキー 2) を使用して重複キーを探します。バックグラウンド (単一) ビルドは 9 つのステージで構成されます。

#### インデックスビルドステージ
<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 人のワーカーが表示されます。
+ **インデックスの構築: ソートキー 1 **- インデックスビルダーは収集されたインデックスキーをソートしています。測定単位は「キー」です。
+ **インデックスの構築: ソートキー 2 **- インデックスビルダーは、収集されたデッドタプルに対応するインデックスキーをソートします。このフェーズは単一インデックスの構築にのみ適用されます。測定単位は「キー」です。
+ **インデックスの構築: キーの挿入** - インデックスビルダーは、新しいインデックスにインデックスキーを挿入しています。測定単位は「キー」です。
+ **検証: インデックスのスキャン** - createIndex はインデックスをスキャンして、検証が必要なキーを見つけます。測定単位は「ブロック」です。
+ **検証: タプルのソート** - createIndex はインデックススキャンフェーズの出力をソートしています。
+ **検証: コレクションのスキャン** - createIndex はコレクションをスキャンして、前の 2 つのフェーズで見つかったインデックスキーを検証しています。測定単位は「ブロック」です。

#### インデックスビルドの出力例
<a name="w2aac33c19b5c13c15"></a>

以下の出力例 (フォアグラウンドインデックスビルド) では、インデックス作成のステータスが表示されています。「msg」フィールドには、ビルドのステージと完了率を示すことで、ビルドの進捗状況がまとめられています。「workers」フィールドは、インデックスビルドの各段階で使用されたワーカーの数を示します。「progress」フィールドには、完了率の計算に使用された実際の数値が表示されます。

**注記**  
「currentIndexBuildName」、「msg」、および「progress」フィールドは Amazon DocumentDB バージョン 4.0 ではサポートされていません。

```
{
    "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="w2aac33c19b7b7b5"></a>
+ `reIndex` は現在、Amazon DocumentDB 5.0 でのみサポートされています。
+ Amazon DocumentDB は、バックグラウンドでの 1 つのインデックスに対する `reindex` をサポートし、複数のワーカーの関与を可能にします。`reIndex` プロセスの実行中も、古いインデックスを用いたクエリの実行が可能です。
+ Amazon DocumentDB は、`currentOp` によるインデックス構築の進行状況レポートをサポートしています。レポートでは、インデックスの作成中に表示される [インデックスビルドステージ](#index-build-stages) と同様のインデックス構築ステージを確認できます。唯一の違いは、一意であるかどうかにかかわらず、`reIndex` のステージ数は常に 8 ステージであることです。「インデックスのビルド中: キーのソート中 \$12」のようなステージはありません。
+ `reIndex` は、同じコレクション上で実行されるインデックス関連のコマンド (`createIndexes`、`dropIndexes`、`collMod`、`renameCollection`) を除いて、あらゆるコマンドと同時に実行できます。
+ `reIndex` は現在、テキスト、地理空間、ベクトル、部分インデックスについてはサポートされていません。

##### `reIndex` の構築
<a name="w2aac33c19b7b7b5b5"></a>

次のコマンドを使用してインデックスを再構築します。

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

オプションで、再構築プロセスに割り当てるワーカーの数をコントロールすることもできます。

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