web-dev-qa-db-ja.com

ダンプをインポートする前または後にインデックスを作成する必要がありますか?

私はmongodbを使用して、40,000,000項目近くある非常に大きなサイズ(90G)を永続化しています。このファイルを読み取って解析し、すべてのアイテムをmongodbに挿入します(私のプログラミング言語はPerl、batch_insertで、1つのアイテムを1つのmongodbドキュメントにマップします)。

挿入する前に、インデックスを事前に作成しました(約10のインデックスキー)。挿入速度が私のニーズ(200から400アイテム/秒)を満たせないことがわかりました。特にコレクションのサイズが非常に大きくなると、インデックスキーが多すぎると挿入が確実に遅くなります。したがって、すべてのデータをdbにダンプした後で、それらにインデックスを付けることができるかどうか疑問に思います。

この方法が利用できるかどうか、そしてそれが私の時間を確実に節約できるかどうか誰かに教えてもらえますか?

7
wuchang

はい、インポートした後でインデックスを作成できます(コレクションのデフォルトの_idインデックスのみが存在します)。結果のインデックスがよりコンパクトで効率的になるため、これもお勧めします(同様の理由で 前景と背景のインデックス付けが推奨されます 余裕がある場合)。ただし、特に10個のインデックスを作成する場合は、完了するまでに少し時間がかかります。

インポート後にビルドするには、インポートが完了するまでインデックスを定義せず、次に ensureIndex() コマンドを使用して必要なインデックスを作成します(通常、このようなインデックスの作成は次のようになります)リソース集中型)。詳細については:

http://docs.mongodb.org/manual/core/index-creation/

7
Adam C

大きなコレクションでも同じ問題がありました。 2日以上のデータの大量インポートプロセスの後、次のステップは、コレクションをできるだけ早く稼働させるためです。

  1. インデックスなしで空のコレクションを作成し、データのみをインポートします。
  2. 単一フィールドインデックスを選択して作成します。
  3. 必要に応じて、複数のフィールドインデックスをすべて作成します。 (これは、5つを超えるフィールドを持つインデックスを持っている私にとっては特に低速でしたが、単一または2つのフィールドではかなり高速です)。
2
harryssuperman