2017-02-17 15 views
1

私は1つの大きなmongodbコレクション(3百万文書、50ギガバイト)を持っています。インデックスを作成してもデータを照会するのが非常に遅くなります。大きなmongodbコレクションで効率的にデータを照会する方法は?

db.collection.find({"C123":1, "C122":2}) 

C123C122の個別のインデックスを作成した場合でも、クエリはタイムアウトになるか、極端に遅くなります(最低10秒)。

クエリを高速化するために、より多くのインデックスを作成するか物理メモリを増やす必要がありますか?

+0

aggregation-frameworkタグはどうなっていますか?質問の質問はそれを使用しません。 –

+0

申し訳ありませんが、 'aggregate- $ match'は' find() 'と同じです – ppn029012

答えて

0

答えは本当に簡単です。

  1. あなたは右のインデックスを作成する必要があり、よりインデックスを作成する必要はありません。フィールドc124のインデックスはフィールドc123のクエリを助けません。そのため、作成するポイントはありません。

  2. より良い/より多くのハードウェアを使用してください。より多くのRAM、より多くのマシン(シャーディング)。

+0

問題は、各キーに正しいインデックスを作成してもmongodbがクエリを終了できないことです。この声明を実行するにはより良いハードウェアを購入する必要がありますか? – ppn029012

+0

@ ppn029012:この正確なクエリを提供するための最良のインデックスは、アランの答えに記載されているように、2つのキーの複合インデックスです。しかし、それでも、あなたの現在のハードウェアはちょうど最高の仕事にはならない可能性が非常に高いです。 –

+0

この50GBのコレクションを操作するにはどのくらいのRAMが必要ですか? – ppn029012

1

複合インデックスを作成する必要があります。両方のフィールドに1つ。そしてそれは非常に効率的でなければなりません。 MongoDBエンジンはクエリの最初の部分の結果を取得するために最初に使用するため、別のインデックスを作成するとあまり役に立ちませんが、2番目のifを使用すると多くの場合役に立ちません(場合によっては照会のためにクエリが遅くなることさえあります)テーブルをインデックス化し、次に実データで再びインデックス化する)。シェル内のクエリで.explain()を使用すると、使用されているインデックスを確認できます。

参照の複合インデックス:

https://docs.mongodb.com/manual/core/index-compound/

はまた、インデックスをしながら、両方のあなたのフィールドの方向をソートすることを検討してください。

+1

Mongodbは数年前からインデックスをマージすることができます。それでも、化合物はより良いはずです。 –

+0

良い点@SergioTulentsev、私は編集しました、私はマージについて知っていましたが、私の経験ではほとんどの場合、それほど助けにはなりません。しかし、正直言って、それを言わなければなりません。 –

+0

このコレクションには400個以上のキーがあるので、複合インデックスの設計についてはもっと考えなければならないようです。 – ppn029012

関連する問題