2011-01-03 4 views
4

コレクションにインデックスが付いていることを常に確認したいので、半定期的にコレクションを追加および削除しています。インデックスがすでに存在する場合、ensureIndex({field:1})のオーバーヘッドは何ですか?

WebリクエストごとにDBに新しい接続を行うと仮定すると、接続するたびにdb.collection.ensureIndex({field:true})文をいくつか実行することはできますか?

答えて

8

私はそれを理解したようMongoDBは単純に...それはそれを作成する前に、インデックスが存在するかどうかを調べるために、システムのコレクションを照会します

http://www.mongodb.org/display/DOCS/Indexes#Indexes-AdditionalNotesonIndexes

> db.system.indexes.find(); 

あなたは(getIndexesを実行することができます)へコレクションのインデックスを参照だから、本当に

> db.things.getIndexes(); 

、あなただけの1つのクエリを追加すると思います。それを再構築することも、何も明白でないことはありません。

つまり、私はこれが特に良い考えだとは思わない。 (あなたがバックグラウンドで実行しない限り)それはそうのような索引ブロックにデータベースを作成し、デフォルトで以来...不要なオーバーヘッドを追加して、インデックスが作成されるように悪化してデータベースをロックすることがあります。しかし、ノート

> db.things.ensureIndex({x:1}, {background:true}); 

大きくなります インデックスを構築するための時間:...

は...バックグラウンドモードの建物は、デフォルト フォアグラウンドモードよりも遅い インデックスを構築する 漸進的なアプローチを使用しています。

は、私はあなたがデータベースに接続代わりに毎回のコレクションを追加するときは、コードでこれを行うにははるかに良いことだと思います。あなたはなぜそれを追加したり削除したりしていますか?

関連する問題