代码之家  ›  专栏  ›  技术社区  ›  Lucas Amos

mongodb查找查询执行时间

  •  0
  • Lucas Amos  · 技术社区  · 6 年前

    我正在尝试测试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执行查询所用的时间少于往返时间。

    但是,如果我使用以下循环将同一查询运行10000次,则执行持续时间始终记录在200到300毫秒之间。(请注意,我已删除 explain() 致电。) 我看不出运行查询10000次怎么会导致执行时间没有明显增加。

    for i in range(10000):
        result = db.threads.find( {"$and": [{ "location" : "JC018" }, {"timestamp": "2018-03-22T23:05:15+00:00"}  ] } )
    

    但是,如果我使用 解释() 函数执行循环似乎需要大约n*250ms的时间。

    for i in range(n):
        result = db.threads.find( {"$and": [{ "location" : "JC018" }, {"timestamp": "2018-03-22T23:05:15+00:00"}  ] } )
    

    有人能解释一下执行查询一次和执行查询10000次之间没有时间差,为什么向循环中添加explain()函数会导致预期的执行时间?

    我认为可能存在某种缓存,但我只在客户端使用PyMongo,在文档中找不到任何提及。

    谢谢

    1 回复  |  直到 6 年前
        1
  •  0
  •   Lucas Amos    6 年前

    因此,经过进一步研究,我发现查询并不会返回数据库中的所有结果,它会返回前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)