fbpx

よくある質問

MongoDB FAQ #2: MongoDB のインデックス

このドキュメントはMongoDBインデックスに関するよくある質問にお答えするものです。インデックスに関する更なる情報はこちらをご参照ください。
1. インデックスを作成するにはどうすれば良いでしょうか?

コレクションにインデックスを作成するには、 db.collection.createIndex() メソッドを使用します。インデックスの作成は データベース管理者しか実行できません。一般的に、アプリケーションは頻繁にdb.collection.createIndex() をコールすべきではありません。

注:
インデックスの構築はパフォーマンスに影響を与えます。こちら( How does an index build affect database performance? )をご参照ください。管理者はインデックスを構築する前に、パフォーマンスの影響を考慮する必要があります。

2. 構築されたインデックスはデータベースのパフォーマンスにどのような影響を与えますか?

コレクションにインデックスを構築する時、インデックスの構築が完了するまで、そのコレクションを保持するデータベースに読み取り/書き込み操作ができません。大きなインデックスを構築する必要があれば、バックグラウンドで構築することを考慮しましょう。こちらをご参照ください。 Index Build Operations on a Populated Collection , Build Indexes on Replica Sets.

現在実行中のインデックス作成操作に関する情報を取得するには、こちらを( Active Indexing Operations )ご参照ください。実行中のインデックス作成操作を強制終了するには、こちら( db.killOp() )をご参照ください。 部分的に構築されたインデックスは削除されます。

3. コレクションにどのようなインデックスが存在するかを確認するにはどうすれば良いでしょうか?

コレクションのインデックスを一覧表示するには、db.collection.getIndexes()メソッドを使用します。

4. クエリでインデックスが使用されているかどうかをどうしたら確認することができますか?

MongoDBがクエリをどのように処理するかを調べるには、 explain() メソッドを使用します。

5. インデックスを作成するフィールドを決定するにはどうしたら良いのでしょうか?

インデックスを作成するフィールドはいくつかの要因によって決まります。例えば、選択性(selectivity)や複数のクエリーシェイプのサポート、インデックスのサイズなどが挙げられます。詳細はこちらをご参照ください。 Operational Considerations for Indexes , Indexing Strategies.

6. インデックスのサイズをどうしたら確認することができますか?

db.collection.stats() 内の indexSizes ドキュメントにて、コレクション上のインデックスごとのサイズ情報が確認できます。

サイズによっては、インデックスはRAMに入りきらないかもしれません。 サーバーに、インデックスとその他ワーキングセット分の十分なRAMがある場合、インデックスはRAMに入ります。インデックスが大きすぎてRAMに入りきらない場合、MongoDB はインデックスをディスクから読まなくてはなりません。これはRAMからの読み込みより随分遅い操作になります。

インデックスのすべてがRAMに入りきる必要がない場合もあります。 詳しくはこちらをご参照ください。 Indexes that Hold Only Recent Values in RAM.

7. 書き込み操作はインデックスにどのような影響を与えますか?

書込み操作の際にインデックス更新が必要になる場合があります。

  • 書込み操作でフィールドを変更すると、MongoDB はその変更されたフィールドをキーとして、保持するすべてのインデックスを更新します。
  • MMAPv1ストレージエンジンで実行しており、ドキュメントがドキュメントによって割り当てられていたレコードサイズより大きくなってしまう場合、MongoDB はドキュメントを新しいレコードに移動させ、変更されたフィールドに関わらず、そのドキュメントを参照するすべてのインデックスを更新します。 

したがって貴方のアプリケーションが書き込みが多い場合は、インデックスがパフォーマンスに影響しかねません。