3

次のシナリオで、何百万ものテストデータレコードで構成されるコレクションで count() を実行するのに必要な時間を見つけようとしています:-

1)最初のMongoシェルから、コードを使用して何百万ものレコードをコレクションに挿入しています

for (var i = 0; i < 10000000; ++i){ 
  db.unicorns.insert({name: 'sampleName', gender: 'm', weight: '440' });
}

2) 2ndMongo シェルから、そのコレクションで count() を見つけようとしています ( Imp: 1st Mongo シェルで挿入がまだ実行されている間)

db.unicorns.count()

調べてみたところ、explain() と stats() は count() コマンドに適用できないことがわかりました。

いくつか

コレクション (ライブ シナリオのようなもの) で挿入が行われているときに count() にかかる時間を調べる必要がありますか?

これを行うための他の良いアプローチはありますか?

4

2 に答える 2

6

MongoDB には組み込みのプロフィラーがあり、次の方法で有効にできます。

db.setProfilingLevel(2)

「2」の代わりに、次のリストから任意のオプションを選択できます。

  • 0 - プロファイラーはオフで、データを収集しません。mongod は常に、slowOpThresholdMs しきい値よりも長い操作をログに書き込みます。
  • 1 - 遅い操作のプロファイリング データのみを収集します。デフォルトでは、遅い操作は 100 ミリ秒よりも遅い操作です。slowOpThresholdMs ランタイム オプションまたは setParameter コマンドを使用して、「遅い」操作のしきい値を変更できます。詳細については、「低速操作のしきい値を指定する」セクションを参照してください。
  • 2 - すべてのデータベース操作のプロファイリング データを収集します。

また、MongoDB のsystem.profileコレクションをチェックすることで、クエリの結果を確認できます。

編集:

パフォーマンスをテストする場合は、mongo コンソールから実行できる次のコード スニペットを使用できます。

> for (var i = 0; i < 10000000; ++i) { db.countTest.insert({a: i % 10}) }
> db.countTest.ensureIndex({a:1})
> db.countTest.count({a: 1})
> db.countTest.count()
> db.countTest.find().count()

そして、私の結論は次のとおりです。

  1. インデックスを追加すると(id は別として) 、約170 ミリ秒で1,000 万レコードのカウントが返されました
  2. IDによるカウント(クエリなしのカウント)は、1ミリ秒未満でカウントを返しました
  3. カーソルを使用した ID によるカウント(.find() はコレクションに対するカーソルとして機能することに注意してください) は、1 ミリ秒未満でカウントを返しました

したがって、コレクションのインデックスが多いほど、クエリは遅くなります_id でカウントする場合はインスタントになります。複合インデックスがある場合は、インデックスの数に基づいてスケーリングされます

于 2014-09-08T08:07:55.307 に答える
4

もっと簡単な方法は

function timeCount(database, collection) {
  db = db.getSiblingDB(database);
  var start = new Date().getTime();
  db.collection.count();
  print("msecs taken: "+ (new Date().getTime() - start) );
 }

これで、関数を呼び出すことができます

 timeCount("yourDB","unicorns")

関数をjsファイルに入れて--shellパラメーターを介してロードするか、それを自分のものに入れて~/.mongorc.jsすべてのdbとコレクションで呼び出すことができます。

于 2014-09-08T10:12:53.730 に答える