1

私はすべてのクエリで mongoose .populate を何度も使用するプラットフォームで作業しています。mongoose デバッグ モードをオンにすると、クエリの実行時間にほとんど差がないことがわかります (100 ドキュメントの場合、100000 ドキュメントになります)。 populate を使用する場合と使用しない場合があります。

基本的に populate も内部で finOne クエリを実行していることを知っています。私の質問は、使用.populateするとクエリ時間が増加するか、レコード数が数百万に達するとパフォーマンスに影響するかということです。また、パフォーマンスを向上させるために選択できる代替手段はありますか

4

1 に答える 1

2

一般に、あなたは正しいです-行ごとに別のクエリを発行するため、populate() の使用を避けたいと考えています。これはサーバーへの完全な往復であることに注意してください。Mongo には結合の概念がまったくないため、入力を行うと、返されたセットの各行に対して追加のクエリを発行することになります。

これを回避する手法は、データを非正規化することです。リレーショナル データベースのような mongo データベースを設計しないでください。mongo docs には、これを行う方法に関する多くの情報があります。https://docs.mongodb.org/manual/core/data-model-design/ Mongo の設計で心に留めておくべき重要なことの 1 つは、無制限に拡大するサブドキュメントを作成したくないということです。mongo のスペース割り当てとページングの仕組みが原因で、これは深刻なパフォーマンスの問題を引き起こす可能性があるため、このような状況にある場合は正規化することをお勧めします。

もう 1 つの非常に一般的な手法は、サブドキュメントのキャッシュです。これは、「結合された」コレクションから部分的なデータを取得し、クエリしているコレクションにキャッシュする場所です。この場合、データが重複しているため、パフォーマンスのためにスペースを犠牲にしています。また、変更があるたびにデータを最新の状態に保つ必要があります。マングースでは、外部コレクションのモデルのポストセーブ フックとしてこれを行うのは簡単です。

于 2015-10-21T07:34:08.790 に答える