問題タブ [mongodb-indexes]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mongodb - 最も単純なインデックスでさえ使用しないMongoDB
次の例を見てください。{a: 1}
クエリはインデックスでカバーする必要があるように思えますがexplain()
、indexOnly: false
. 私が間違っていることは何ですか?
mongodb - 複数のフィールドの MongoDB インデックス
MongoDB in action book のインデックスに関する章を読んだことがありますが、インデックスに関する内容を詳しく説明できる人がいるかどうか疑問に思っていました。
カバーするインデックスがあり、インデックスa,b,c,d,e
に対するクエリa,b,c
が使用されている場合。をクエリするとどうなりますa,c,e
か? インデックスはクエリに使用されるだけa
ですか、それとも他のフィールドでクエリを実行するときに使用されますか?
この場合、 にもインデックスを付ける方が理にかなっていますかa,c,e
。ユーザーが自由形式のクエリを作成できるこれらのフィールドにリンクするフロント エンド ピースがあるためです ( a,b,c,f
1 つの可能性があります)。考えられる可能性のあるすべてのオプションのインデックスが必要ですか?
mongodb - Mongodbバックグラウンドインデックス-作成された後もバックグラウンドですか?
mongodbでインデックスを作成するときに、background: true
フラグを指定できます。これにより、インデックスの作成が非ブロッキングになります。これは、以前は明らかに重要ではなかったインデックスを作成するときにデータベース全体をロックしたくないので、本番環境では優れています(データベースがなかったため)。
ドキュメントを読むと、このフラグはインデックスの作成方法を決定するだけのようです。作成が完了すると、インデックスは通常のインデックスとまったく同じように機能します。これが私が望んでいることです-これを行うデータベースを想像することはできますが、インデックスがバックグラウンドで更新されているため、インデックスがドキュメントと同期しなくなることは望ましくありません。
getIndexes
コマンドは、インデックスが作成された後もまだマークされていることを示しているので、ここで質問していbackground
ます。これは、それがどのように作成されたかについての単なる思い出させるものですか?または、background
作成後のインデックスの動作は異なりますか?たぶん、レプリケーションに微妙な点がありますか?
mongodb - マルチキー インデックスに対するスロー レンジ クエリ
3,500 万post
個のオブジェクトで名前が付けられた MongoDB コレクションがあります。コレクションには、次のように定義された 2 つのセカンダリ インデックスがあります。
と で単純にフィルタリングする次のクエリは、すべてのオブジェクトをスキャンせずに妥当な時間内に実行されるnamespace
と思います。post_time
ただし、MongoDB が結果を取得するには少なくとも 10 分かかり、興味深いことに、MongoDBは関数に従ってジョブを実行するために7,000 万explain
のオブジェクトをスキャンすることに成功しています。
オブジェクトの数とスキャンの数の違いは、タグ配列の長さ (すべて 2 に等しい) によって発生する必要があります。post_time
それでも、フィルターがインデックスを利用しない理由がわかりません。
何が欠けているのか教えてもらえますか?
(私は 24 コアと 96 GB RAM の降下マシンで作業しています。MongoDB 2.2.3 を使用しています。)
mongodb - 2 番目のフィールドのみでクエリを実行する場合の複合インデックスでのクエリ オプティマイザーのインデックス選択
複合インデックス があるとします{ a: 1, b: 1 }
。
クエリdb.Collection.find( { b: 1 } )
はこのインデックスを使用しません。クエリ オプティマイザーは、このインデックスを実行候補として選択していないようです。
ただし、具体的hint
にインデックスを指定すると、クエリははるかに高速に実行され、nscan
はるかに低くなります。
db.Collection.find( { b: 1 } ).hint( { a: 1, b: 1 } )
私の質問は、インデックスを使用するとクエリが高速になる場合、クエリオプティマイザーがクエリのインデックスを単独で無視するのはなぜですか?b
mongodb - 各属性が mongodb コレクションでインデックス付けされている場合、複合インデックスは必要ですか?
次のドキュメントを含むmongoデータベースにコレクションがあるとします
コレクションには多くのオブジェクト (100 万程度) があり、私のアプリケーションは、このコレクションに定期的にオブジェクトを追加する以外に、このデータに対していくつかの異なる種類の検索を行います。
1 つのメソッドは 3 つの属性 (名前、電子メール、電話番号) すべてで検索を行うため、これら 3 つのフィールドの複合インデックスを作成して、この検索が効率的に機能するようにします。
現在、アプリケーションには、同じ名前のすべてのオブジェクトを取得するメソッドもあります (悪い例です)。そのため、名前フィールドのインデックスが必要です。
私のアプリケーションは徐々に成長し、他のフィールドにインデックスを付ける必要があります。
さて、私の質問です。各属性に個別にインデックスを付けた場合でも、3 つすべての属性 (または 2 つの属性) の複合インデックスを維持することは理にかなっていますか?
明らかに、これは悪い例です...個人の複数の連絡先情報を格納するコレクションを作成する場合は、配列を使用します。ただし、この質問は純粋にインデックスに関するものです。
mongodb - コレクションに新しいアイテムを追加した後、MongoDB クエリが遅くなるのはなぜですか?
これに関するヘルプは大歓迎です。
ユーザー アクティビティを格納する大規模な Mongodb コレクションがあります。実行したいクエリ用の複数の複合インデックスがあり、通常、クエリのパフォーマンスは素晴らしく、ユーザー アクティビティ ストリームはすぐに読み込まれます。
ただし、最近、2 時間ごとに 20,000 レコードをコレクションに追加するバックグラウンド タスクを追加しました (ユーザーごとに 1 つの新しいレコード)。このタスクが追加されてから、これらのレコードが追加された後に初めてアクティビティ ストリームにアクセスしたときに、ページが読み込まれるまでに大きな遅延があることに気付きました。次に、ページを更新すると、すぐに読み込まれます。
アクセスしようとした後、新しいアイテムがインデックスに追加されるだけのようです。しかし、MongoDB FAQ で読んだことから、それらは自動的にインデックスに追加されます - http://docs.mongodb.org/manual/faq/indexes/#should-you-run-ensureindex-after-every-insert。おそらく、まだ追加されていないだけの場合ですか?
役立つ場合は、これが私のコレクション統計です。