28

mongodbでインデックスを作成するときに、background: trueフラグを指定できます。これにより、インデックスの作成が非ブロッキングになります。これは、以前は明らかに重要ではなかったインデックスを作成するときにデータベース全体をロックしたくないので、本番環境では優れています(データベースがなかったため)。

ドキュメントを読むと、このフラグはインデックスの作成方法を決定するだけのようです。作成が完了すると、インデックスは通常のインデックスとまったく同じように機能します。これが私が望んでいることです-これを行うデータベースを想像することはできますが、インデックスがバックグラウンドで更新されているため、インデックスがドキュメントと同期しなくなることは望ましくありません。

getIndexesコマンドは、インデックスが作成された後もまだマークされていることを示しているので、ここで質問していbackgroundます。これは、それがどのように作成されたかについての単なる思い出させるものですか?または、background作成後のインデックスの動作は異なりますか?たぶん、レプリケーションに微妙な点がありますか?

4

2 に答える 2

26

作成されると、通常のインデックスと同じように機能します。それらは、などgetIndexesと同様に、リマインダーとして存続します。uniquesparse

しかし、それは他の意味も持っています。フォアグラウンドインデックスがすべてのライターをブロックするという理由だけで、この場合、db.testCollection.getIndexes()すべてのインデックスが作成されるまで実行できません。一方、バックグラウンドインデックスを作成すると、呼び出すことができdb.testCollection.getIndexes()、そのインデックスはすでに作成されているように見えます。

ただし、この場合、インデックスが実際に作成されているかどうかはわかりません。この場合、db.currentOp()を呼び出す必要があり、次のようなものが表示された場合

{
  "inprog": [
    {
      "opid": 2001060,
      "active": true,
      "secs_running": 1,
      "op": "insert",
      "ns": "test.system.indexes",
      "insert": {
        "v": 1,
        "key": {
          "a": 1
        },
        "ns": "test.testCollection",
        "name": "a_1",
        "background": 1
      },
          ....
      "msg": "bg index build Background Index Build Progress: 368640/1000000 36%",
      "progress": {
        "done": 368640,
        "total": 1000000
      }
      ...
    }
  ]
}

つまり、バックグラウンドインデックスの作成がまだ進行中であり、プロセスに関するいくつかの情報を確認することもできます。

たとえば、大まかな計算を行うことができます。1000000のうち368640は1秒(可能な限りオフセットは+1秒)かかるため、すべてが3〜6秒かかるはずです(最終的には4.8秒かかります)。

明らかに、そのような操作が進行中であることがわからない場合は、インデックスがすでに作成されています。

:同時操作が多数ある場合は、、db.currentOp()feにsearсh引数を指定できます。

db.currentOp({"insert.background":1})
于 2013-03-24T10:24:04.677 に答える
3

フォアグラウンド(デフォルト)とバックグラウンドの複数のインデックスオプションがあります。フォアグラウンドは比較的高速で、すべてのライターとリーダーをブロックします。まだアクセスできる他のデータベース。これは、実稼働環境では実行されないはずです。

バックグラウンドインデックスの作成は少し遅く、リーダーとライターをブロックしません。2.4以降でMongoDBは、同じデータベース上でも複数のバックグラウンドインデックスを並行して作成できます。

2.6MongoDB以降、プライマリのバックグラウンドでインデックスを作成すると、セカンダリのバックグラウンドでもインデックスが作成されます。セカンダリは、プライマリがインデックスの作成を完了すると、インデックスの作成を開始します。

本番システムで非常に効率的にインデックスを作成する別の方法があります。これは、ほとんどのクエリを処理するために使用されている別のサーバーにインデックスを作成することです。たとえば、連携して動作する複数のデータベースサーバーのレプリカセットで、1つを取り出して、要求を使用可能なサーバーにルーティングできるとします。フォアグラウンドインデックスの作成は、分離されたサーバーで実行できます。作成が正常に完了したら、クラスターに戻すことができます。

于 2016-09-04T10:41:02.057 に答える