我正在尝试对mongodb性能进行基准测试,并且我在理解mongodb如何执行查询时遇到问题,特别是他们需要多长时间才能完成。
如果我运行以下代码:
import pymongo
#Connect to the database
client = MongoClient("mongodb://.../testrecords")
db = client.testrecords
start = datetime.datetime.now()
result = db.threads.find( {"$and": [{ "location" : "JC018" }, {"timestamp": "2018-03-22T23:05:15+00:00"} ] } ).explain()
endtime = datetime.datetime.now()
print ("duration: " + str(endtime-start))
print(result)
我收到以下输出:duration: 0:00:00.531754
。我还获得explanation()
函数的结果,其中提供了以下信息executionTimeMillis': 249
这是有道理的,因为mongodb执行查询所花费的时间少于往返时间。
但是,如果我使用以下循环运行相同的查询10,000次,则执行持续时间始终记录在200到300毫秒之间。 (请注意,我已删除了explain()
来电。)
我没有看到如何运行10,000次查询会导致执行时间没有显着增加。
for i in range(10000):
result = db.threads.find( {"$and": [{ "location" : "JC018" }, {"timestamp": "2018-03-22T23:05:15+00:00"} ] } )
但是,如果我使用explain()
函数运行循环,它似乎需要大约n * 250ms才能执行循环。
for i in range(n):
result = db.threads.find( {"$and": [{ "location" : "JC018" }, {"timestamp": "2018-03-22T23:05:15+00:00"} ] } )
任何人都可以解释一次执行查询并执行10,000次时缺少时间差异以及为什么在循环中添加explain()函数会导致预期的执行时间?
我认为可能会有某种缓存,但我只在客户端使用PyMongo,在文档中找不到任何提及。
由于
答案 0 :(得分:0)
因此,经过更多的研究,我发现查询没有返回数据库中的所有结果,它返回前100条记录和Cursor
对象,它是对结果集的引用,可以迭代。
因此,要实际从数据库中获取所有结果,可以使用以下代码:
results = []
for doc in db.threads.find( { "timestamp": { "$gt": "2018-02-20T20:08:00+00:00", "$lt": "2018-02-20T22:54:42.3+00:00"} } ):
results.append(doc)