【问题标题】:MongoDB - query time in profiler and from Python codeMongoDB - 探查器和 Python 代码中的查询时间
【发布时间】:2021-06-01 05:58:53
【问题描述】:

我试图了解对我的 MongoDB 集合(大约 20 万个文档)进行一些基本查询需要多少时间,但我不明白为什么根据 MongoDB 分析器查询需要大约 15 毫秒,而从 Python 查询需要 1 到 2 秒。

为了从 Python 跟踪查询,我做了一些非常基本的事情:

import time
from pymongo import MongoClient

client = MongoClient('')
db = client.my_db

start = time.time()
query = db['my_col'].find({'unix': {'$gte': 'some_timestamp' }})
data = list(query)
end = time.time()

print(end-start)

所以在这里我只是在特定的unix 时间戳之后检索所有文档,然后将查询转换为 Python 列表。这段代码的输出平均从>>1.01>>1.80 秒,而根据分析器,查询只需要几毫秒。

我在这里缺少什么?是不是因为真正需要时间的是游标的循环?

【问题讨论】:

  • 此代码包括将查询发送到数据库、执行查询、使用所有查询结果对象创建list、将结果从服务器发送到的网络时间客户端和建立连接的时间。 MongoDB 探查器将仅包括执行查询的时间。此代码测量的内容与分析器测量的内容不同。如果您担心性能,请尝试增加游标批量大小并确保 pymongo 使用 C 扩展。
  • 非常感谢@MichaelRuth!很清楚

标签: python mongodb


【解决方案1】:

pymongo 在第一个事务命令之前不会连接到数据库。因此,您的时间安排包括所有连接设置等。

这应该会给你更准确的时间安排:

import time
from pymongo import MongoClient

client = MongoClient('')
db = client.my_db

db['my_col'].find_one()

start = time.time()
query = db['my_col'].find({'unix': {'$gte': 'some_timestamp' }})
data = list(query)
end = time.time()

print(end-start)

【讨论】:

  • 非常感谢!但是,根据分析器的说法,您知道为什么查询所需的时间要少得多吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 2020-04-07
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多