0

我是 MongoDB 的新手。我编写了一个在 mongo shell 中运行的 JS 查询。

基本上,我有两张桌子。两者都有近 160,000 条记录。

我正在遍历第一个表和每条记录,转到第二个表以查找那里是否存在相应的记录。

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 条。一个类似的请求在有索引的情况下执行大约 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 回答