Pymongo明显比mongo shell慢?

6g8kf2rb  于 7个月前  发布在  Shell
关注(0)|答案(1)|浏览(101)

我对mongodb比较陌生,在pymongo中遇到了性能问题。我有一个50 GB(未压缩)20 GB(通过WiredTiger压缩)的集合,大约有3900万个文档。在索引字段上查询它得到的结果是大约125,000个文档和150 MB未压缩。当我在mongo shell中执行以下操作时,大约需要一秒钟。

var result = db.my_collection.find(my_query).toArray()

然而,当我在pymongo中做同样的事情时,它需要超过7秒。

db = pymongo.MongoClient()['my_db']
result = list(db['my_collection'].find(my_query))

一些额外的信息:

  • 我使用的是Ubuntu 14.04,Python 2.7.6,pymongo 3.2和mongo 3.2。
  • 我认为我的pymongo配置为使用C,因为我安装了python-dev,并且pymongo.has_c()和bson.has_c()都显示True。
  • 一切都在当地运行。

我很难相信pymongo比mongo shell慢7倍。我错过了什么?

0kjbasz6

0kjbasz61#

可能有以下一个或多个原因导致这种行为。
1.执行查询时数据库的负载以及执行这两个操作的顺序会极大地影响查询的响应时间。例如,如果您首先使用pymongo进行查询,则WiredTiger可能会从磁盘加载数据。当从mongo shell执行相同的查询时,数据已经存在于WiredTiger缓存中(因为第一个查询是使用pymongo进行的)。
1.当使用pymongo客户端查询数据库时,第一个请求通常比后续请求慢。你可以自己做这样的事情来检查-

db = pymongo.MongoClient()['my_db']
 result = list(db['my_collection'].find(my_query))
 #make another query returning same amount of data
 result_2 = list(db['my_collection'].find(my_query_2))

你会发现“result”会比“result_2”花费更多的时间。因此,第一个请求的执行时间通常很长,对于性能分析来说并不可靠。
1.正如你已经提到的,解析mongo文档并将其转换为python对象也需要一些时间。

相关问题