0

モンゴッド:

1: {'num':1}{'num':2}{'num':3}{'num':4} などのコレクション

私のプログラムで:

list=[1,2,3,4]
db.collection.find({'num':{"$in":list}})

for i in list:
    db.collection.find({'num':i})

2つの方法に違い(パフォーマンス)はありますか?

このシーンがある場合: collection1:{'num':1}{'num':2}{'num':3}{'num':4} などのコレクション

collection2:{'n':1}{'n':2}{'n':3}{'n':4}

nums=db.collection1.find()

1:

for num in nums:
    db.collection2.find({'n':num})

2:

list=[]
for num in nums:
    list.append(num)
db.collection2.find({'n':{"$in":list}})

2つの方法に違い(パフォーマンス)はありますか?

4

2 に答える 2

2

最初のものは、検索クエリ全体を一度にデータベースに送信し、1 つの接続で [1,2,3,4] を検索します。

2 番目のものは接続を開き、1 を検索し、結果を返し、ネットワークを介して戻って 2 を検索します。これは遅くなるはずです。

于 2012-07-01T13:57:39.533 に答える
0

はい、一般的に、さまざまな要因により違いが生じます。

  • Sergio が観察したように、「1 回の呼び出し」アプローチには、ネットワーク ラウンドトリップの減少が伴います。リストが大きく、ネットワークが低速で、テーブル全体に順番にアクセスする場合、このオプションはより高速に実行されます。
  • 一方、検索しているフィールドにインデックスがある場合、単一のクエリはより高速に実行されます。リストが小さく、ネットワークが高速で、全体的なデータベース アクセスが遅い場合は、この 2 番目のオプションの方が高速に実行される可能性があります。

実際に何が起こるかに応じて (つまり、コレクション内のドキュメントにも巨大なペイロードがあり、インデックスを介してではなく直接アクセスする方がコストがかかる場合や、レコードがいくつあるかなど)、さまざまなレベルのエラーが発生する可能性があります。パフォーマンスは向上しますが、一般的にどのアプローチがより便利かは言えません。

また、違いは、シャーディングを行っているかどうかなど、データベースのサイズによっても影響を受けます。

率直に言って、実世界の大きなデータベースでは、両方のバージョンを異なる負荷条件で数回実行し、それらの時間を測定したいと思います。あまりにも多くの要因が関係しており、ネットワーク ラウンドトリップはその 1 つにすぎません。

システムを設計している場合は、前提条件 (成長とスケーリングを含む) を慎重に検討してください。物事が小さいときは非常に高速に動作し、データベースが大きくなったり、クラウドに移行したりすると糖蜜になるソリューションを思い付くのは非常に簡単です。

于 2012-07-01T14:02:22.973 に答える