2016-10-24 5 views
0

私たちは現在、フルスキャンのコレクション の収集を避けることができない状況に直面しています。既にクエリとデータ構造を最適化していますが、 はさらにシャーディングとレプリケーションを最大限に活用したいと考えています。mongodbフルスキャンクエリのパフォーマンスを向上させる:レプリケーションまたはシャーディング?

設定

- mongodb version 3.2 
- monogo-java-driver 3.2 
- storageEngine: wiredTiger 
- compression level: snappy 
- database size : 6GB 

ドキュメント構造:

個人コレクション

{ 
    "_id": 1, 
    "name": "randomName1", 
    "info": {...} 
}, 
{ 
    "_id": 2, 
    "name": "randomName2", 
    "info": {...} 
}, 
[...] 
{ 
    "_id": 15000, 
    "name": "randomName15000", 
    "info": {...} 
} 

値コレクション

{ 
    "_id": ObjectId("5804d7a41da35c2e06467911"), 
    "pos": NumberLong("2090845886852"), 
    "val": 
     [0, 0, 1, 0, 1, ... 0, 1] 
}, 
{ 
    "_id": ObjectId("5804d7a41da35c2e06467912"), 
    "pos": NumberLong("2090845886857"), 
    "val": 
     [1, 1, 1, 0, 1, ... 0, 0] 
} 

"val"配列には個々の要素が含まれています(したがって、配列の長さは 〜15000です)。個体のidは "val"配列内の対応するインデックスです。

クエリ

は、クエリは、ヴァルの合計が[individual._id] idividualsのリストについては、具体的なtreshold上記 ある値のコレクションからドキュメントを見つけることです。実行中に個人のリストが変更されたいので、 配列の合計を事前に計算することはできません(たとえば、最初の2000人だけの の結果を得ることができます)。このクエリは、集約フレームワークを使用します。

我々は100〜500サブクエリでクエリを分割して並列で5によってそれらを5を実行します。私たちが現在やっている

。我々はできるようにしたいと思います

最初のサブクエリは、POS> 0とPOS < 50000ドキュメントのための同じクエリになり、 POS> 50000文書やPOS < 100000電気ショック療法のための第二...

より多くのサブクエリを同時に実行できますが、1つのmongodインスタンスで5つ以上を実行すると、 のパフォーマンス低下に直面しています。

そこで質問はです:私たちは同じ時間にサブクエリの最大数を実行する ために複製またはシャーディングのために(あるいはその両方のために)行くべき? mongodbをできるだけ最適にレプリカ/シャード間でサブクエリをディスパッチするように設定するにはどうすればよいですか?

編集:クエリが既に完全に最適化されているとしましょう!

答えて

1

レプリケーションはデータの冗長性と高可用性のために使用されるものなので、クエリのパフォーマンスを向上させようとしている場合は、すぐにそのオプションを排除することができます。

シャーディングオプションがありますが、次のステップはクエリの説明を投稿し、誰かがパフォーマンスを改善するための提案をすることができるかどうかを確認することです。あなたが逃したことがあるかもしれないチューニングがあるかもしれません。あるいは現在のMongoDBサーバーのRAMまたはCPUをアップグレードすることによってパフォーマンスが向上するかもしれません。

簡潔に言えば、私はシャーディングのすべての努力に行く前に説明を投稿することをお勧めします。

+0

お返事ありがとうございます!たぶん私は他の質問で説明を投稿するかもしれませんが、今はクエリが既に十分に最適化されていると仮定しましょう。何をすべきですか? – felix

関連する問題