我有一个查询需要很长时间才能完成。
我喜欢做一些性能测试,但是在我检查了一次之后(这需要大约30秒),查询开始运行得更快(我假设它必须与MongoDB缓存一起使用。
有没有一种方法可以禁用MongoDB的缓存,或者另一种方法可以检查性能?
我正在使用MongoHQ中托管的MongoDB。使用Ruby on Rails 3编程。
解释如下:
{"cursor"=>"BtreeCursor start_-1", "nscanned"=>5276, "nscannedObjects"=>5276, "n"=>25, "millis"=>3264, "nYields"=>0, "nChunkSkips"=>0, "isMultiKey"=>false, "indexOnly"=>false, "indexBounds"=>{"start"=>[[{"$maxElement"=>1}, {"$minElement"=>1}]]}, "allPlans"=>[{"cursor"=>"BtreeCursor attendees_count_-1", "indexBounds"=>{"attendees_count"=>[[1.7976931348623157e+308, 1]]}}, {"cursor"=>"BtreeCursor images_count_-1", "indexBounds"=>{"images_count"=>[[1.7976931348623157e+308, 2]]}}, {"cursor"=>"BtreeCursor start_-1", "indexBounds"=>{"start"=>[[{"$maxElement"=>1}, {"$minElement"=>1}]]}}, {"cursor"=>"BtreeCursor start_-1_end_-1", "indexBounds"=>{"start"=>[[{"$maxElement"=>1}, {"$minElement"=>1}]], "end"=>[[{"$maxElement"=>1}, {"$minElement"=>1}]]}}, {"cursor"=>"BtreeCursor attendees._id_1 multi", "indexBounds"=>{"attendees._id"=>[[BSON::ObjectId('4f0b621e94bb688563000007'),BSON::ObjectId('4f0b621e94bb688563000007')], [BSON::ObjectId('4f0b647d5a8c00acde05236f'), BSON::ObjectId('4f0b647d5a8c00acde05236f')], [BSON::ObjectId('4f0b647d5a8c00acde052370'), BSON::ObjectId('4f0b647d5a8c00acde052370')], [BSON::ObjectId('4f0b647d5a8c00acde052371'), BSON::ObjectId('4f0b647d5a8c00acde052371')], [BSON::ObjectId('4f0b647d5a8c00acde052372'), BSON::ObjectId('4f0b647d5a8c00acde052372')], [BSON::ObjectId('4f0b647d5a8c00acde052373') ... (lots of Object IDs)]]}}}
注意,我不得不删掉一些解释,因为它太长了。
有“很多对象ID”的地方有很多对象ID(~400)。
谢谢大家
最佳答案
我想你不能阻止Mongo准备查询计划(Mongo就是这样工作的)。
所以,在查询统计数据之前……
1。按清除所有集合的计划缓存
>db.colllction_name.getPlanCache().clear()
用Profiler记录慢查询(参见mongo docs)。
对查询进行优化,
再次清除缓存,然后再次检查查询性能。