2

私はMongoDBで最初のプロジェクトを行っていますが、私が見たものから、コレクションの暗黙的な作成が推奨される方法です(つまり、最初に挿入が行われたときに db.myCollection.insert() がコレクションを作成します)

私は PHP を使用しており、このようにさまざまなコレクションを使用していますが、問題は、そのコレクションに必要なインデックスをどこに作成すればよいかわからないことです。コレクションがいつ作成されるかわからないため、単純なアプローチでは、そのコレクションに対するすべての操作の直前に ensureIndex() を呼び出すことになります (これはあまり良く聞こえません)。または、データベースへの接続が確立されるたびに、インデックスが存在することを確認します (作成されていないコレクションにインデックスを作成するとどうなりますか? それは定義されていますか?)

これに関するベストプラクティスのアドバイスはありますか?

4

2 に答える 2

2

それがベスト プラクティスかどうかはわかりませんが、アプリに ensureIndex を入れない傾向があります。私は通常、dbシェルを使用して必要になると確信しているものを入れます。次に、負荷テスト中 (または本番環境で速度が低下し始めたとき) に注意を払い、見逃したものをシェルに追加します。ensureIndex({a : 1}, {background : true}) を実行することで、バックグラウンドでインデックスを作成できるため、後で作成しても他のデータベースほどひどいものではありません。

MongoDB には、速度が低下しているものを見つけるための優れたプロファイラーがあります: http://www.mongodb.org/display/DOCS/Database+Profiler

10gen (MongoDB の商用版) には無料の監視サービスがあり、私はまだ使用していませんが、よく話題になっています: http://www.10gen.com/mongodb-monitoring-service

ただし、コレクションが作成される前に db.collection.ensureIndex() を呼び出すとどうなるかという限りでは、コレクションが作成され、それにインデックスが配置されます。

アプリで確実に必要な場合は、各操作の前ではなく、2番目のオプション(データベース接続の直後にインデックスを確認する)を使用します。私が行ったときにおそらくデータベースに何かを保存するので、2つ以上ある場合は毎回実行されません。PHPはわかりませんが、ここに疑似コードがあります:

var test = db.systemChecks.findOne({indexes : true})
if (test == null) //item doesn't exist
{
   //do all the ensureIndex() commands
   db.systemChecks.insert({indexes : true})
}

後でインデックスを実行するためにさらにインデックスが必要な場合は、systemCheck アイテムを削除することを忘れないでください。

于 2012-11-15T23:22:46.347 に答える
1

実際、ensureIndex()はまさにあなたがする必要があることです。特定の接続を使用する各モデルのコンストラクターでそれを行います-それらのモデルの1つがある場合)。sureIndex()は、インデックスがまだ存在しない場合にのみ作成されるようにします。または、データベース接続を作成するときにそれを行うこともできます。存在しないコレクションに対してensureIndex()を実行すると、そのコレクションが作成され、空のインデックスが作成されます(ドキュメントがまだないため)。

将来的には、PHPドライバーは、ensureIndex()が同じリクエストですでに実行されているかどうかもキャッシュし、基本的にはノーオペレーションにします:https ://jira.mongodb.org/browse/PHP-581

于 2012-11-15T23:19:37.853 に答える