Pymongo 比 mongo shell 慢得多?

Bra*_*ndt 7 python shell mongodb pymongo

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

var result = db.my_collection.find(my_query).toArray()
Run Code Online (Sandbox Code Playgroud)

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

db = pymongo.MongoClient()['my_db']
result = list(db['my_collection'].find(my_query)) 
Run Code Online (Sandbox Code Playgroud)

一些额外的信息:

  • 我使用的是 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 倍。我错过了什么?

小智 0

可能有以下一个或多个原因导致这种行为。

  1. 查询执行时数据库上的负载以及执行这两个操作的顺序可能会极大地影响查询的响应时间。例如 - 如果您首先使用 pymongo 进行查询,WiredTiger 可能会从磁盘加载数据。从 mongo shell 执行相同的查询时,数据已存在于 WiredTiger 缓存中(因为使用 pymongo 进行的第一个查询)。

  2. 当使用 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))
    
    Run Code Online (Sandbox Code Playgroud)

    你会发现“result”会比“result_2”花费更多的时间。因此第一个请求的执行时间通常很长,对于性能分析来说并不可靠。

  3. 正如您已经提到的,解析 mongo 文档并将其转换为 python 对象也需要一些时间。