我是MongoDB的新手。我编写了一个JS查询,我在mongo shell中运行。
基本上,我有两张桌子。两者都有近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”在数据库中有一个索引。
答案 0 :(得分: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})
如果您有任何疑问,请随时提出。