我创建了一个小速度测试
from misc.Database import Database
import time
db = Database.getDb()
def main():
test_db = db.test_db.find({})
return "done"
if __name__ == '__main__':
start = time.time()
for i in range(10000):
main()
end = time.time()
print(end - start)
db
我的 pymongo 客户端在哪里。在监控 mongod 日志时,我意识到它在运行测试时打开了 2 个连接。当我运行 Robo3T 时,它打开了 25 个与 Mongod 的连接。为什么每个请求都没有打开连接?每次查询数据库时会打开多少个连接?
首先,您使用的是旧方法进行连接。更新更好的方法是 using
MongoClient
,所有最近发布的受支持的驱动程序都支持该方法。这里有详细解释:https ://mongodb.github.io/node-mongodb-native/driver-articles/mongoclient.html 。请注意,尽管该链接讨论了它的节点驱动程序实现,但它也与 pymongo 相关。其次,您没有在返回的游标上进行迭代。这意味着
find()
查询没有在服务器上执行。我认为您在此测试中看到了一个非常快的结果,如果您实际上是从服务器获取数据,则情况并非如此。第三,Python 本质上是单线程的。Pymongo 足够聪明,可以意识到您没有迭代光标,因此它重用连接而不是创建新连接。创建一个新的连接非常昂贵,所以除非真的有必要,否则驱动程序不会这样做。您看到的两个连接可能一个用于监视服务器状态,另一个用于执行您的查询。打开新连接的成本导致驱动程序使用连接池。
第四,Robo3T 是一个 GUI,所以它自然需要打开更多的连接,因为它可能需要来自服务器的大量信息,也许是异步的。这是与司机完全不同的情况。你无法真正将两者进行比较。
最后,性能测试是一个棘手的主题,必须以非常可控的方式进行。一些需要计划的事情:
list(db.test_db.find())
,您如何判断数据库是否很慢,或者是 Python 的list()
方法很慢?