0

私はMongoDBが初めてです。mongo シェルで実行している JS クエリを作成しました。

基本的に、私は2つのテーブルを持っています。どちらも約 160,000 のレコードを持っています。

最初のテーブルとすべてのレコードについて、2 番目のテーブルに移動して、対応するレコードがそこに存在するかどうかを確認しています。

pbp = db.poss_pbp.find().batchSize(1000)


while(pbp.hasNext()){

  pbp_temp = pbp.next();
  id = (pbp_temp["poss_idx"]);

  opt_temp = db.poss_opt.find({"poss_idx": id}).count()

  if(opt_temp == 0)
  {
    //Do something
  }
}

クエリの実行が非常に遅い (1000 レコードごとに約 4 ~ 5 分)。より速く動作させるにはどうすればよいですか? キー "poss_idx" はデータベースにインデックスを持っています。

4

1 に答える 1

1

インデックスに問題があると思います。200,000 レコードと約 500,000 の 2 つの同様のテーブルがあります。同様のリクエストが、インデックスがある場合は約 40 秒間実行され、インデックスがない場合は非常に長い時間実行されます。

クエリを実行します。

 db.poss_opt.find({poss_idx: "some_id"}).explain()

上記のクエリでインデックスを使用できなかった場合は、次のように表示されます。

 {
     "cursor": "BasicCursor",
     "nscannedObjects": 532543,
     "nscanned": 532543,
     "millis": 712,
     "indexBounds": {},
 }

さもないと:

 {
     "cursor": "BtreeCursor poss_idx_1",
     "nscannedObjects": 0,
     "nscanned": 0,
     "millis": 0,
     "indexBounds": {"poss_idx": [["some_id", "some_id"]]},
 }

コレクションのインデックス情報を表示するには、 と を使用db.poss_opt.stats()します。db.poss_opt.getIndexes()

問題がインデックスにある場合は、削除して新しいインデックスを作成してみてください。

 db.poss_opt.dropIndex({poss_idx: 1})
 db.poss_opt.ensureIndex({poss_idx: 1})

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2013-06-12T04:30:02.427 に答える